为什么这个对象似乎不应该被访问?

时间:2015-08-10 22:35:06

标签: javascript arrays object

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中测试。

1 个答案:

答案 0 :(得分:2)

当您遇到新密钥时,不会复制该对象,因此您为第一个条目创建的objData将同时用于“???”输入AND 重复使用输入'Grand Total'条目。它们都引用完全相同的对象,因此每次将值添加到“总计”时,您都会将相同的更改应用于“???”条目(因为它是同一个对象)。

最简单的解决方案是,只要您需要在obj变量中创建新条目而不是仅使用传递给addToTotalsObject的对象,就可以使用您的值创建新对象。