Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ES2015 non-mutating array swap in React component (or flux action)

Maybe I have just been searching on the wrong keywords, but I have been trying to find an example of a JavaScript (preferably ES2015+) function to swap two array values in a non-mutating (immutable) way. I'd also like to do this using pure JS and not have to add in a immutability library.

For example, if I have [1, 2, 3, 4, 5, 6], I'd like to pass 3 and 4 (or probably their indexes) into a function that returns a new array [1, 2, 4, 3, 5, 6]. I found a few ways to do this, but they mutate the array by directly replacing the values. I need an immutable way. I am guessing maybe using slice? I am doing this is a React component if that matters and the array is a state value.

TIA!

like image 298
D Durham Avatar asked Mar 13 '23 16:03

D Durham


2 Answers

Not ES6 (Still learning it)

function swap(array, first, second){
  var final = array.slice();
  temp = final[first];
  final[first] = final[second];
  final[second] = temp;
  return final
}

ES6 Thanks to @Benjamin

const swapIndices = (array,index1,index2) => { 
  const newArray = array.slice(); 
  newArray[index1] = array[index2]; 
  newArray[index2] = array[index1]; 
  return newArray; 
}
like image 119
Borjante Avatar answered Apr 27 '23 10:04

Borjante


function swap(arr, i1, i2) {
    // i1 must be lower
    if (i1 > i2) i1 = [i2, i2 = i1][0];
    return arr
        .slice(0,i1)
        .concat(arr[i2])
        .concat(arr.slice(i1+1,i2))
        .concat(arr[i1])
        .concat(arr.slice(i2+1))
}

Maybe not perfect, but a stepping stone :)

like image 32
mejdev Avatar answered Apr 27 '23 11:04

mejdev