更改在JS阵列单对象改变所有元素
问题描述:
我有71个对象的数组:更改在JS阵列单对象改变所有元素
var data = []
我填充此与来自同时包含该填充data
的对象的静态和动态元素数据库中的数据的到来。
angular.forEach(returnData,function(value,index) {
if(!Array.isArray(value)) {
tempObject[key] = value;
}
});
for(i = 0; i < 71; i++) {
data.push(tempObject);
}
所以,在有角的,我抓住每一个元素是从返回数据的静态,创建它的一个对象,并重复相同的对象71次。因此,该数据可能会开始了这样的事情:
[
{'a': 1,
'b': 2,
'd': 7
},
{'a': 1,
'b': 2,
'd': 7
}
]
那我走了,并抓住一切都传回作为数组的元素,并设法将它们添加到data
阵列。
但是,只要我添加第一个元素,它会为数组中的每个对象设置相同的元素。
意思就是说data[0]['c'] = 11;
将导致:
[
{'a': 1,
'b': 2,
'c': 11,
'd': 7
},
{'a': 1,
'b': 2,
'c': 11,
'd': 7
}
]
即使我没有碰过数组中的第二个索引。当我更新第二个索引时,它也会更新第一个索引。我确信我在这里失去了一些东西。
谢谢!
答
您只需将对tempObject
的引用推入data
阵列中的71个不同位置即可。因此,data[0]
,等都指向相同的对象,这就是为什么您看到数组中反映的更改。
如果您想要实际推送71个独立实例,则每次将其推入阵列时都必须克隆tempObject
。
上次我检查,克隆一个普通的旧JavaScript对象的最有效方法是字符串IFY,然后再解析:
data.push(JSON.parse(JSON.stringify(tempObject)));
答
你自己说的:数组包含同一对象71次。不是一个对象的71份副本,而是相同的单个对象引用71次。因此,通过这些引用中的任何一个来更改该对象将反映在所有引用中。