在javascript中复制对象数组到另一个数组(深度复制)

使用slice(0)和concat()在javascript中将对象数组复制到另一个数组中不起作用。

我已经尝试了以下来testing,如果我得到预期的深拷贝使用这种行为。 但是,原来的数组也被修改后,我在复制的数组进行更改。

var tags = []; for(var i=0; i<3; i++) { tags.push({ sortOrder: i, type: 'miss' }) } for(var tag in tags) { if(tags[tag].sortOrder == 1) { tags[tag].type = 'done' } } console.dir(tags) var copy = tags.slice(0) console.dir(copy) copy[0].type = 'test' console.dir(tags) var another = tags.concat() another[0].type = 'miss' console.dir(tags) 

我怎样才能做一个数组的深入副本到另一个,以便原始数组不会修改,如果我在副本数组中进行更改。

尝试

 var copy = JSON.parse(JSON.stringify(tags)); 

尝试以下

 // Deep copy var newArray = jQuery.extend(true, [], oldArray); 

有关更多详细信息,请检查此问题什么是在JavaScript中深入克隆对象的最有效方法?

如上所述.slice(0)将有效克隆与原始types元素的数组。 然而在你的例子tags数组包含匿名对象。 因此,对克隆数组中的这些对象所做的任何更改都会反映在tags数组中。

@ dangh上面的回复取消了这些元素对象并创build了新元素。

这是另一个线程处理类似的情况

最简单和乐观的做法就是使用Underscore / Lodash

让a = _.map(b,_.clone)

同样的问题发生在我身上。 我有服务的数据并保存到另一个variables。 当我更新我的数组复制arrays也更新。 旧代码如下所示

 //$scope.MyData get from service $scope.MyDataOriginal = $scope.MyData; 

为此我使用新的ECMAScript 6 Object.assign方法:

 let oldObject = [1,3,5,"test"]; let newObject = Object.assign({}, oldObject) 

这个方法的第一个参数是要更新的数组,我们传递一个空对象,因为我们想要一个全新的对象,

你也可以添加其他的对象来复制:

 let newObject = Object.assign({}, oldObject, o2, o3, ...)