Tuesday, 31 May 2016

javascript - (Deep) copying an array using jQuery











I need to copy an (ordered, not associative) array of objects. I'm using jQuery. I initially tried



jquery.extend({}, myArray)



but, naturally, this gives me back an object, where I need an array (really love jquery.extend, by the way).



So, what's the best way to copy an array?


Answer



Since Array.slice() does not do deep copying, it is not suitable for multidimensional arrays:



var a =[[1], [2], [3]];
var b = a.slice();

b.shift().shift();

// a is now [[], [2], [3]]


Note that although I've used shift().shift() above, the point is just that b[0][0] contains a pointer to a[0][0] rather than a value.



Likewise delete(b[0][0]) also causes a[0][0] to be deleted and b[0][0]=99 also changes the value of a[0][0] to 99.



jQuery's extend method does perform a deep copy when a true value is passed as the initial argument:



var a =[[1], [2], [3]];

var b = $.extend(true, [], a);

b.shift().shift();
// a is still [[1], [2], [3]]

No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...