0

我从朋友那里得到了这段代码(下面的小提琴链接)。我试图弄清楚的问题是数组(arr1,它是一个对象数组)自动将索引 0 处的对象的数量属性与索引 2 处的对象组合在一起,如控制台日志中所示。但是,如果我通过将其注释掉来停止对函数 addByPayCodeAndLaborAcc() 的调用,那么它将按应有的方式记录正常数组。请帮助为什么会发生这种情况。应该是吊装的原因吧。

这是小提琴。 http://jsfiddle.net/3ZQNg/

我看到的 console.log

[Object, Object, Object, Object]
0: Object
amount: "0414:54:32"
laboracc: "1"
pcname: "a"
__proto__: Object
1: Object
2: Object
amount: "14:54:32"
laboracc: "1"
pcname: "a"
__proto__: Object
3: Object
length: 4

但是我在代码中的数组是

arr1 = [
    {
        pcname : "a",
        laboracc : "1",
        amount : "04" 
    },     
    {
        pcname : "b",
        laboracc : "1",
        amount : "777"
    },
    {
        pcname : "a",
        laboracc : "1",
        amount : "14:54:32",
    },
    {
        pcname : "c",
        laboracc : "2",
        amount : "23"
    }];

为什么索引 0 处的对象的数量属性会自动附加到索引 2 处的对象的数量属性?

解决方案 :我找到了原因。当对象被复制时,它们是通过引用复制的。也就是说,同一个对象保留在堆中,并且仅复制其引用,这与按值复制的主要变量类型(如 Number 或 String)不同(即创建了一个新副本)。最初 uiqueRows 是 []。selectedTotals 数组中的第一个对象(带有 pcname a)然后被复制到 uniqueRows(通过引用复制 - 因此 uniqueRows[0] 现在与 selectedTotals[0] 相同)。然后我们将第二个对象添加到 uniqueRows。当我们来到具有相同 pcname“a”的第三个对象时,摘要对象被设置为 uniqueRows[0](与 selectedTotals[0] 相同)。因此,当 summary.amount 实际上更新时 selectedRows[0] 的数量属性正在更新(因为它们引用堆中的相同对象)。

请参考更新后的小提琴中的 console.logs。日志表明返回为“summary”的对象与 selectedTotals[0] 相同,因此在日志 http://jsfiddle.net/3ZQNg/1/中打印“true”

4

2 回答 2

1

addByPayCodeAndLaborAcc认为第一"a"项是第二项的总结。它将amount第一"a"项的字段设置为用 计算的一些奇怪的东西getAmountInTimeOrCurrency,最终连接数量。我不确定你的代码为什么会这样做,但这就是你编写它的方式。

于 2014-01-04T15:22:27.983 回答
0

在 Chrome 开发工具中,所有对象似乎都返回正确的索引位置:

start (index):127
Array[4]
0: Object
1: Object
2: Object
3: Object
length: 4
__proto__: Array[0]
于 2014-01-04T14:08:41.550 回答