我有一个对象数组
var obj = {'name': 'John'};
var obj2 = {'name': 'Sam'};
var arr = [];
arr.push(obj);
arr.push(obj2);
现在我创建一个新的数组arr2
作为
arr2 = arr.slice();
现在,如果我更改arr2[0]['name'] = 'David';
然后arr1[0]['name']
也变为'David';
如果arr
对象值发生更改,我们如何防止arr2
的任何对象值发生变化。
答案 0 :(得分:1)
你必须克隆每个对象,而不仅仅是数组:
function cloneObject(obj) {
var result = {};
for (var k in obj) {
if (Object.prototype.hasOwnProperty.call(obj, k)) {
result[k] = obj[k];
}
}
return result;
}
var arr2 = arr.map(cloneObject);
我们有办法阻止对象改变吗?
是的,有Object.freeze
:
arr.forEach(Object.freeze);
答案 1 :(得分:0)
复制数组时,只复制数组中的值,但值是对象的引用。最终得到两个独立的数组,但引用了相同的对象。
您需要制作一份深层副本,即复制每个级别的所有内容:
var arr2 = JSON.parse(JSON.stringify(arr));
现在你有一个完全独立的数组副本及其中的所有内容。