我有一个包含71个对象的数组:
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
}
]
即使我没有触及数组中的第二个索引。当我更新第二个索引时,它也会更新第一个索引。我确信这里有一些我不知道的东西。
谢谢!
答案 0 :(得分:1)
您只是将对tempObject
的引用推送到data
数组中的71个不同位置。因此,data[0]
,data[1]
等都指向同一个对象,这就是为什么您会看到更改反映在整个数组中的原因。
如果您想实际推送71个单独的实例,则每次将其推送到阵列时都必须克隆tempObject
。
最后我检查过,克隆普通旧JavaScript对象的最有效方法是string-ify然后重新解析:
data.push(JSON.parse(JSON.stringify(tempObject)));
答案 1 :(得分:1)
你自己说过:数组包含71次相同的对象。不是71个对象的副本,但是相同的单个对象引用了71次。因此,通过任何这些引用更改该对象将反映在所有引用中。