可能的重复:
克隆 JavaScript 对象的最有效方法是什么?
我需要复制一个(有序的,非关联的)对象数组。我正在使用 jQuery。我最初尝试
jquery.extend({}, myArray)
但是,自然地,这给了我一个对象,我需要一个数组(顺便说一下,真的很喜欢 jquery.extend)。
那么,复制数组的最佳方法是什么?
可能的重复:
克隆 JavaScript 对象的最有效方法是什么?
我需要复制一个(有序的,非关联的)对象数组。我正在使用 jQuery。我最初尝试
jquery.extend({}, myArray)
但是,自然地,这给了我一个对象,我需要一个数组(顺便说一下,真的很喜欢 jquery.extend)。
那么,复制数组的最佳方法是什么?
由于 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]]
$.extend(true, [], [['a', ['c']], 'b'])
那应该为你做。
我意识到您正在寻找数组的“深层”副本,但是如果您只有一个单级数组,则可以使用以下命令:
复制原生 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
JavaScript 中的所有内容都是通过引用传递的,因此如果您想要数组中对象的真正深层副本,我能想到的最佳方法是将整个数组序列化为 JSON,然后将其反序列化回来。
如果您想使用纯 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