我怎样才能复制的每一个元素的数组(其中的元素是对象)的,到另一个阵列,使他们完全独立的? 我不想在一个阵列中改变元素相互影响。
Answer 1:
如果目标阵列不存在...
...您可以使用slice()
或concat()
slice()
可能更习惯(你还可以看到slice(0)
但默认是0,所以...):
var destinationArray = sourceArray.slice(); // Probably more idiomatic
// or
var destinationArray = sourceArray.concat();
作为ES2015(又名ES6)的,也有Array.from
,从任何阵列状的东西(包括实际的数组)创建新的数组:
var destinationArray = Array.from(sourceArray);
( Array.from
可以匀/ polyfilled老年JavaScript引擎。)
另外,作为ES2015的,你可以使用迭代传播符号和数组文本与可迭代的(包括数组):
var destinationArray = [...sourceArray];
在那之后,两个数组将具有相同的内容。 改变一个数组不会改变对方。 自然地,如果一个阵列条目是一个对象,用于在两个数组该对象将指向同一对象的条目; 这不是一个“深”的副本。
如果目标数组存在...
......你希望将源数组的内容追加到它,你可以使用push
:
destinationArray.push.apply(destinationArray, sourceArray);
该工程通过调用push
使用目标阵列上apply
的JavaScript函数的功能,它可以让你指定的参数的函数调用数组。 push
将推尽可能多的元件,因为它有自变量,所以它最终从复制源数组到目标数组的元素。
在ES2015以后,你可以用迭代传播符号(即清洁...
):
destinationArray.push(...sourceArray);
请注意,在这两种情况下,呼叫是由JavaScript引擎的函数参数的最大数量限制(在本文撰写时,数以千计这至少对所有主要引擎[而不是在几十万,至少不会对Chrome的V8 ])。
下面是一个ES5版本:
var source1, dest1, source2, dest2; snippet.log("If dest doesn't exist yet:"); source1 = [1, 2, 3, 4]; dest1 = source1.slice(0); snippet.log("[before change] source1 = " + source1.join(", ")); snippet.log("[before change] dest1 = " + dest1.join(", ")); source1[2] = "three"; dest1[3] = "four"; snippet.log("[after change] source1 = " + source1.join(", ")); snippet.log("[after change] dest1 = " + dest1.join(", ")); snippet.log("If dest already exists and we're just appending:"); source2 = [1, 2, 3, 4]; dest2 = ['a', 'b', 'c', 'd']; snippet.log("[before append] source2 = " + source2.join(", ")); snippet.log("[before append] dest2 = " + dest2.join(", ")); dest2.push.apply(dest2, source2); snippet.log("[before change] source2 = " + source2.join(", ")); snippet.log("[before change] dest2 = " + dest2.join(", ")); source2[2] = "three"; dest2[7] = "four"; snippet.log("[after change] source2 = " + source2.join(", ")); snippet.log("[after change] dest2 = " + dest2.join(", "));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
Answer 2:
简单的方法来得到这个工作是使用:
var cloneArray = JSON.parse(JSON.stringify(originalArray));
我有一个问题越来越arr.concat()
或arr.splice(0)
给深拷贝。 上面的代码中完美的作品。
Answer 3:
克隆一个数组的一个好方法是使用数组文本和蔓延运营商 。 这是由ES2015成为可能。
let objArray = [{name:'first'}, {name:'second'}, {name:'third'}, {name:'fourth'}];
let clonedArr = [...objArray];
console.log(clonedArr) // [Object, Object, Object, Object]
你可以找到MDN的文档中的传播运营商这个副本选项https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Copy_an_array
这也是一个Airbnb的最佳实践。 https://github.com/airbnb/javascript#es6-array-spreads
注 :通常蔓延运营商在ES2015进入深度只有一层,而复制数组。 因此,它们不适合复制多维数组。
Answer 4:
var clonedArray = array.concat();
Answer 5:
如果你想保持参考:
Array.prototype.push.apply(destinationArray, sourceArray);
Answer 6:
有两个重要的注意事项。
- 使用
array.concat()
采用了棱角分明1.4.4和jQuery 3.2.1不工作(这是我的环境)。 - 所述
array.slice(0)
是一个对象。 所以,如果你这样做newArray1 = oldArray.slice(0); newArray2 = oldArray.slice(0)
newArray1 = oldArray.slice(0); newArray2 = oldArray.slice(0)
这两个新的阵列将参照仅1阵列和改变一个会影响其他。
或者,使用newArray1 = JSON.parse(JSON.stringify(old array))
将仅拷贝值,从而它创建一个新阵列中的每个时间。
Answer 7:
我建议使用concat()
如果您使用的NodeJS。 在其他情况下,我发现, slice(0)
工作正常。