javascript - 为什么这个对象似乎在不应该被访问的时候被访问了?

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

最佳答案

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

最简单的解决方案是当您需要在 obj 变量中创建一个新条目时,使用您的值创建一个新对象,而不是仅仅使用传递给 addToTotalsObject< 的对象.

关于javascript - 为什么这个对象似乎在不应该被访问的时候被访问了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31930290/

相关文章:

javascript - 在一定窗口宽度下将元素的 margin-left 减半

javascript - javascript 的 Set 和普通的普通对象有什么区别?

javascript - 如何以编程方式修改 PDF 文件中的 JavaScript 事件?

javascript - Factors 函数获取最小公倍数或素数

python - 如何将数组从 .txt 文件导入到 numpy 数组?

javascript - 如何减少setTimeOut中 'current'的时间?

c++ - C++ 中的文件 I/O 代码

javascript - 如何将特定的 Json 部分作为独立对象返回?

python - 为什么对象中的字典与其他字典没有区别?

c# - 将对象类型数据转换为值类型的最佳方法