复制对象的数组成在javascript另一个数组(Copying an array of objec

2019-09-01 05:03发布

我怎样才能复制的每一个元素的数组(其中的元素是对象)的,到另一个阵列,使他们完全独立的? 我不想在一个阵列中改变元素相互影响。

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:

有两个重要的注意事项。

  1. 使用array.concat()采用了棱角分明1.4.4和jQuery 3.2.1不工作(这是我的环境)。
  2. 所述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)工作正常。



文章来源: Copying an array of objects into another array in javascript