在this fiddle ,数组中的第一个对象 (???
) 最终将包含与 Grand Total
对象中的值相等的值。
我不明白为什么 ???
中的值会发生变化。为什么是这样?数组的第一位有什么特别之处?
data = [{
"name": "???",
"number": 2,
"value": 3,
"int": 4
}, {
"name": "Kitten",
"number": 342,
"value": 3432,
"int": 334
}, {
"name": "Kitten",
"number": 3306,
"value": 1387,
"int": 1191
}, {
"name": "Cat",
"number": 10263,
"value": 4239,
"int": 3727
}, {
"name": "Name with spaces",
"number": 6770,
"value": 2107,
"int": 2799
}, {
"name": "Jquery",
"number": 9982,
"value": 3535,
"int": 3786
}]
obj = {};
function addToTotalsObject(item, objData) {
//create an object for each object name to store the sum all values in objects with the same name
if ( !! obj[item]) {
//add
obj[item].number += objData.number;
obj[item].value += objData.value;
obj[item].int += objData.int;
} else {
//create
obj[item] = objData;
}
}
for (var i = 0; i < data.length; i++) {
objData = {
"number": data[i].number,
"value": data[i].value,
"int": data[i].int
};
addToTotalsObject(data[i].name, objData);
addToTotalsObject("Grand Total", objData); //object to hold sum of all values in all objects
}
console.log(obj);
在 Firefox 39 中测试。
最佳答案
当您遇到新键时,您不会复制该对象,因此您为第一个条目创建的 objData 将同时用于 '???' entry AND reused 用于“Grand Total”条目。它们都引用完全相同的对象,因此每次将值添加到“总计”时,您都会将这些相同的更改应用到“???”条目(因为它是同一个对象)。
最简单的解决方案是当您需要在 obj
变量中创建一个新条目时,使用您的值创建一个新对象,而不是仅仅使用传递给 addToTotalsObject< 的对象
.
关于javascript - 为什么这个对象似乎在不应该被访问的时候被访问了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31930290/