在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中测试。
答案 0 :(得分:2)
当您遇到新密钥时,不会复制该对象,因此您为第一个条目创建的objData将同时用于“???”输入AND 重复使用输入'Grand Total'条目。它们都引用完全相同的对象,因此每次将值添加到“总计”时,您都会将相同的更改应用于“???”条目(因为它是同一个对象)。
最简单的解决方案是,只要您需要在obj
变量中创建新条目而不是仅使用传递给addToTotalsObject
的对象,就可以使用您的值创建新对象。