(Deep)使用jQuery复制一个数组

26 浏览
0 Comments

(Deep)使用jQuery复制一个数组

我需要复制一个(有序的,非关联的)对象数组。我正在使用jQuery。我最初尝试使用jquery.extend({}, myArray),但是,自然地,这会给我返回一个对象,而我需要一个数组(顺便说一句,我真的很喜欢jquery.extend)。那么,复制一个数组的最佳方法是什么?

0
0 Comments

在这段内容中,作者提到了一个问题,即如何进行数组的深拷贝。作者首先给出了一种浅拷贝数组的方法,使用了JavaScript中的Array.slice()方法,通过这个方法可以创建一个数组的副本。然后作者给出了一个示例,将数组foo通过slice方法复制给了数组bar,最后通过push方法给数组bar添加了一个元素,可以看到foo数组没有改变,而bar数组增加了一个元素。接着作者指出,这种方法并不是深拷贝,只是对数组的引用进行了复制。最后作者提到,虽然问题中没有明确提到需要深拷贝,但是只要涉及到数组的复制,无论是浅拷贝还是深拷贝,都可以给出答案。所以,问题的出现原因是需要对数组进行深拷贝,解决方法是使用其他方法进行深拷贝。

0
0 Comments

((Deep) copying an array using jQuery)这个问题的出现的原因是在复制多维数组时,使用jQuery的$.extend()函数的默认行为会导致无法正确地复制数组。

解决这个问题的方法是将第一个参数设置为true,即$.extend(true, [], [['a', ['c']], 'b'])。这将告诉$.extend()函数进行深拷贝,以正确地复制多维数组。

这个解决方法是由Sussman在回答中提到的,他指出在复制多维数组时必须使用"true"作为第一个参数。

总结起来,要在jQuery中进行(深)拷贝一个数组,特别是多维数组,需要使用$.extend(true, [], array)这样的语法。这将确保正确地复制数组,避免出现问题。

0
0 Comments

深拷贝一个数组是一个常见的需求,特别是对于多维数组来说。然而,使用Array.slice()方法进行拷贝并不适用于多维数组。下面的代码示例展示了使用slice()进行拷贝的问题:

var a =[[1], [2], [3]];
var b = a.slice();
b.shift().shift();
// a现在变成了[[], [2], [3]]

需要注意的是,尽管上面的例子使用了shift().shift(),但重点是b[0][0]包含的是指向a[0][0]的指针而不是值。同样,delete(b[0][0])会导致a[0][0]被删除,b[0][0]=99也会改变a[0][0]的值。

为了解决这个问题,可以使用jQuery的extend方法,并将true作为第一个参数传递进去,这样就可以进行深拷贝:

var a =[[1], [2], [3]];
var b = $.extend(true, [], a);
b.shift().shift();
// a仍然是[[1], [2], [3]]

通过将数组作为第一个参数传递给extend方法,可以实现对数组的深拷贝。这种方法非常方便,可以避免多维数组拷贝时的问题。

值得一提的是,b.shift().shift()这一行代码只是为了展示a和b不持有相同的值。这并不意味着a和b应该表示为[[3]]。Shift方法会完全删除数组中的第一个值,而不管它的类型是什么。它不会递归搜索并删除基本类型。数组的长度会减少1,并且在原地进行修改。

总结起来,使用var b = $.extend(true, [], a);这行代码可以实现对数组的深拷贝,避免了直接赋值方式造成的数组改变问题,这种方法非常实用。

0