(深度)使用 jQuery 复制数组

IT技术 javascript jquery
2021-01-26 18:15:33

可能的重复:
克隆 JavaScript 对象的最有效方法是什么?

我需要复制一个(有序的,非关联的)对象数组。我正在使用 jQuery。我最初尝试

jquery.extend({}, myArray)

但是,自然地,这给了我一个对象,我需要一个数组(顺便说一下,真的很喜欢 jquery.extend)。

那么,复制数组的最佳方法是什么?

6个回答

由于 Array.slice() 不做深度复制,所以不适合多维数组:

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

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

请注意,虽然我在shift().shift()上面使用过,但重点只是b[0][0]包含指向a[0][0]而不是值的指针

同样delete(b[0][0])也导致 a[0][0]被删除,b[0][0]=99也将 的值更改a[0][0]为 99。

当一个真值作为初始参数传递时,jQuery 的extend方法执行深度复制:

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

b.shift().shift();
// a is still [[1], [2], [3]]
谢谢!你的行: var b = $.extend(true, [], a); 救了我!我使用了 $.extend(true, {}, a) 大括号而不是方括号!
2021-03-14 18:15:33
感谢它很有帮助,通常当我们通过直接赋值方式复制数组时,当一个数组发生变化时,其他复制的数组也会发生变化,所以这种方法是真正的复制。
2021-03-18 18:15:33
你能在这里解释一下 b.shift().shift() 的目的是什么吗?
2021-04-05 18:15:33
谢谢诺亚。看起来我最大的问题是我将 $.extend 和 object 作为它的第一个参数,而不是数组。
2021-04-06 18:15:33
b 只是被操纵以表明 a 和 b 不具有相同的值。a 和 b 不应该表示为 [[3]] 吗?Shift 完全删除数组中的第一个值,无论它是任何类型。它不会对原始类型执行递归搜索,然后将其删除。保存方法上下文的数组的长度总是减 1 并就地编辑。
2021-04-08 18:15:33

$.extend(true, [], [['a', ['c']], 'b'])

那应该为你做。

这不适用于多维数组,您必须使用“true”作为@Noah Sussman 回答中提到的第一个参数
2021-04-07 18:15:33

我意识到您正在寻找数组的“深层”副本,但是如果您只有一个单级数组,则可以使用以下命令:

复制原生 JS 数组很容易。使用Array.slice()方法创建部分/全部数组的副本。

var foo = ['a','b','c','d','e'];
var bar = foo.slice();

现在 foo 和 bar 是 'a','b','c','d','e' 的 5 个成员数组

当然 bar 是副本,而不是参考...所以如果你接下来这样做...

bar.push('f');
alert('foo:' + foo.join(', '));
alert('bar:' + bar.join(', '));

你现在会得到:

foo:a, b, c, d, e
bar:a, b, c, d, e, f
笔者已经把括号,这样就复制任何答复是值得欢迎的。实际问题的文本甚至根本不包含“深”这个词
2021-03-21 18:15:33
Array.slice 不提供深拷贝,这正是这里提出的问题。
2021-04-01 18:15:33
请注意,这不是深拷贝。
2021-04-03 18:15:33
类似:var a = [1,2,3]; var b = ([]).concat(a); b 是副本
2021-04-10 18:15:33

JavaScript 中的所有内容都是通过引用传递的,因此如果您想要数组中对象的真正深层副本,我能想到的最佳方法是将整个数组序列化为 JSON,然后将其反序列化回来。

原语不通过引用传递。不过,对象(包括数组)是。
2021-03-21 18:15:33

如果您想使用纯 JavaScript,请尝试以下操作:

 var arr=["apple","ball","cat","dog"];
 var narr=[];

 for(var i=0;i<arr.length;i++){
     narr.push(arr[i]);
 }
 alert(narr); //output: apple,ball,vat,dog
 narr.push("elephant");
 alert(arr); // output: apple,ball,vat,dog
 alert(narr); // apple,ball,vat,dog,elephant