如何克隆Javascript对象数组?
我有一个结果集,它是一个对象数组。 我需要克隆它,以便我可以对其进行更改,而无需触及原始数据。
var data = w2ui.grid.records, exclude = Array('recid', 'w2ui'); // Exclude these data points from the pivot // Modify our tempData records to remove HTML $.each(data, function(key, value) { $.each(value, function(_key, _value) { if(jQuery.inArray(_key, exclude) != -1) { delete data[key][_key]; }else{ data[key][_key] = $(''+_value+'').text(); // for those which are simply strings. } }); });
在这个例子中,我创建了一个名为data
的变量,并将其设置为我的“源数据”。
我希望能够对这个新的数据变量进行更改,但看起来在更改它时,源数据正在被更改( w2ui.grid.records
)。
有没有正确的方法来克隆这个集合,所以我可以有一个新的数据实例来修改?
编辑
深度克隆使用JSON.parse(JSON.stringify(arr));
浅克隆使用slice(0);
var arr = [{'obj1':1}, {'obj2':2}]; var clone = arr.slice(0); console.log(clone);
有各种方法可以做到 –
let arr = [{ 'obj1': 1 }, { 'obj2': 2 }]; // 1 const arr2 = arr.slice(); console.log(arr2); // 2 const arr3 = [].concat(arr); console.log(arr3); // 3 // or use the new ES6 Spread const arr4 = [...arr]; console.log(arr4); // 4 const arr5 = Array.from(arr); console.log(arr5);
既然你正在使用jquery,你可以试试extend
:
var arr = [{'obj1':1}, {'obj2':2}]; var clone = jQuery.extend(true, [], arr); clone[0]['obj1']=10; console.log(clone); console.log(arr);
Lodash有一种专门用于此方法的方法,称为clonedeep
。 如果您不想拉入整个库,那么它有一个独立的包:
这是因为数组被保存为指针,因此设置新变量只是指向同一个数组。
我所知道的最简单的方法是用切片…
var data = w2ui.grid.records.slice(0);
这将创建一个包含所有原始值的新数组,因为您正在从第一个(0)切片。
如果你需要深度克隆,因为你的数组也包含对象/数组,试试这个……
您可以通过ES6传播运营商实现这一目标
var arr1 = [1] var arr2 = arr1 arr1 === arr2 //true arr2.push(2) arr2 //[1, 2] arr1 //[1, 2] var arr3 = [...arr1] //create a copy of existing array arr1 === arr3 //false arr2 === arr3 //false arr3.push(3) arr3 //[1, 2, 3] arr1 //[1, 2] arr2 //[1, 2]
同样的语法也可以用于javascripts对象
var newObj = [… existingObj]
我使用新的ES6 Object.assign方法:
let oldObject = [1,3,5,"test"]; let newObject = Object.assign({}, oldObject);
这个方法的第一个参数是要更新的数组,我传递一个空对象,因为我想要一个新的新对象。
我们也可以使用以下语法,它们相同但更短:
let newObject = [...oldObject];
ES6:
如果您还想拥有克隆对象,则必须传播数组和对象:
const newArrayOfObjects = [ ...originalArrayOfObject ].map(i => ({ ...i}));