我从朋友那里得到了这个代码(下面的小提琴链接)。我想弄清楚的问题是数组(arr1,它是一个对象数组)自动将索引0处对象的amount属性与索引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处的对象的amount属性会自动附加到索引为2的对象的附加值?
解决方案:我发现了原因。 复制对象时,将通过引用复制它们。这是同一个对象保留在堆中,只复制它的引用,这与由value复制的主要变量类型(如Number或String)(创建新副本)不同。 最初uiqueRows是[]。然后将selectedTotals数组中的第一个对象(带有pcname a)复制到uniqueRows(通过引用复制 - 因此uniqueRows [0]现在与selectedTotals [0]相同)。然后我们将第二个对象添加到uniqueRows。当我们使用相同的pcname“a”来到第三个对象时,summary对象被设置为uniqueRows [0](与selectedTotals [0]相同)。因此,当实际更新summary.amount时,selectedRows [0]的amount属性将更新(因为它们引用堆中的同一对象)。因此附加的值会反映在日志中。
请参阅更新后的小提琴中的console.logs。日志表明返回为“summary”的对象与selectedTotals [0]相同,因此在日志中打印“true” http://jsfiddle.net/3ZQNg/1/
答案 0 :(得分:1)
addByPayCodeAndLaborAcc
认为第一个"a"
项是第二项的摘要。它将第一个amount
项的"a"
字段设置为使用getAmountInTimeOrCurrency
计算的奇怪事物,最终将数量连接起来。我不确定为什么你的代码会做这些,但这就是你编写它的方式。
答案 1 :(得分:0)
在Chrome开发工具中,所有对象似乎都返回正确的索引位置:
start (index):127
Array[4]
0: Object
1: Object
2: Object
3: Object
length: 4
__proto__: Array[0]