在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, ...)