How can I copy every element of an array (where the elements are objects), into another array, so that they are totally independent? I don't want changing an element in one array to affect the other.
This question is related to
javascript
arrays
deep-copy
There are two important notes.
array.concat()
does not work using Angular 1.4.4 and jQuery 3.2.1 (this is my environment).array.slice(0)
is an object. So if you do something like newArray1 = oldArray.slice(0); newArray2 = oldArray.slice(0)
, the two new arrays will reference to just 1 array and changing one will affect the other.Alternatively, using newArray1 = JSON.parse(JSON.stringify(old array))
will only copy the value, thus it creates a new array each time.
Easy way to get this working is using:
var cloneArray = JSON.parse(JSON.stringify(originalArray));
I have issues with getting arr.concat()
or arr.splice(0)
to give a deep copy. Above snippet works perfectly.
A great way for cloning an array is with an array literal and the spread syntax. This is made possible by ES2015.
const objArray = [{name:'first'}, {name:'second'}, {name:'third'}, {name:'fourth'}];
const clonedArr = [...objArray];
console.log(clonedArr) // [Object, Object, Object, Object]
You can find this copy option in MDN's documentation: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Copy_an_array
It is also an Airbnb's best practice. https://github.com/airbnb/javascript#es6-array-spreads
Note: The spread syntax in ES2015 goes one level deep while copying an array. Therefore, they are unsuitable for copying multidimensional arrays.
I suggest using concat()
if you are using nodeJS. In all other cases, I have found that slice(0)
works fine.
var clonedArray = array.concat();
If you want to keep reference:
Array.prototype.push.apply(destinationArray, sourceArray);
Source: Stackoverflow.com