推送到数组会覆盖相似的条目
Pushing to Array Overwrites Similar Entries
基本上我想做的是从一个数组中获取一个对象,将 属性 附加到该对象,然后将该新对象推送到一个新数组。问题是,一旦我将该对象推送到新数组(使用新的、不同的 属性),它就会覆盖新数组中与该新对象具有相似属性的所有先前对象,尽管我更改了 属性 推送前。
应该是什么:
{propA: "Name", propB: "Age", propC: "Location1"}
{propA: "Name", propB: "Age", propC: "Location2"}
{propA: "Name", propB: "Age", propC: "Location3"}
变为:
{propA: "Name", propB: "Age", propC: "Location3"}
{propA: "Name", propB: "Age", propC: "Location3"}
{propA: "Name", propB: "Age", propC: "Location3"}
您可以在此处找到代码,相关行以黄色突出显示:http://pastie.org/private/ym8dbp1jpjwyrgbpdubk3a#47-52,59,67,85-86
这里是控制台输出,显示正确的信息被推送到 cliAllow
但正在被覆盖:http://pastie.org/private/g3480a91tr3jvhftxaclq
编辑: 这是 JSBin 中的简化版本:http://jsbin.com/kanibo/2/edit?js,console
我正在从我的旧代码重写这段代码,这是我第一次在 javascript 中编写,所以请原谅代码中其他地方可能不正确的编程方法。
非常感谢您的帮助。我已经尝试调试了将近一个星期,我已经精疲力尽了。
问题是您没有将对象的副本推送到数组 cliAllow
,而是将引用推送到同一对象。
所以让我们通过外部 while
循环的第一次迭代,看看结果是什么:
cliAllow.push(arr[4]);
cliAllow.push(arr[4]);
cliAllow.push(arr[4]);
现在,cliAllow.length
是 3,索引从 0 到 2,但是您有 3 个数组项指向同一个对象(notPassed
数组中的最后一个,因为您重新倒数。)
因此,cliAllow[0], cliAllow[1], cliAllow[2]
现在都引用同一个对象。
这意味着,当您设置 party
属性 时,您将同一个对象更改 3 次:
cliAllow[2].party = "NT";
cliAllow[1].party = "VL";
cliAllow[0].party = "LF";
你基本上是这样做的:
var obj = {milestone: "Mlstn4", client: "Client2", trade: "Trade3", units: "25.0", party: "B"};
obj.party = "NT";
obj.party = "VL";
obj.party = "LF";
如您所见,您在这里对同一个对象写入同一个 属性 3 次,这意味着它将被设置为您最后一次给它的值("LF"
这种情况)。
在您的代码中,notPassed
数组中有 5 个项目,但您只有 5 个而不是 15 个不同的对象,并且这 5 个对象中的每一个都获得其 party
属性 设置为 mlstnParties
数组中的最后一个值。
解决这个问题的一种方法是创建一个复制函数:
function copy(obj) {
var cp = {};
for (var o in obj) {
cp[o] = obj[o];
}
return cp;
}
在此处查看实际效果:http://jsbin.com/kibeba/2/edit
我写这篇文章是为了理解代码在做什么,并确认我理解它在做什么。
当我 运行 名为 gatherResponses()
的函数时,它将 65 个对象放入数组 notPassed
中(使用您提供的数据)。对象属性为:
{client:"Client 1", trade:"Batch 21", units:250, milestone:"Milestone 18", due:(new Date(1423803600000))}
然后那个名为 notPassed
的对象数组被传递给函数 checkThresholds()
然后 notPassed
数组(现在命名为 arr
)的元素(对象)被推入另一个名为 cliAllow
.
的数组中
cliAllow[cliAllow.length] = arr[arrLen];
然后访问新数组中的特定对象并为 party
属性 分配一个值。
cliAllow[cliAllow.length-1].party = mlstnParties[0][mlstnCol];
while 循环正在从最大数倒数到零。因此,变量 arrLen
从最高数字变为零。这意味着数组正在从最后一个元素(最后一个对象)到第一个对象进行处理。它不起作用 "front to back",但从数组中的最后一个元素(对象)向后移动。
notPassed
数组中的原始对象中,没有party
属性。因此,添加的 party
属性。
party
属性 正在从 mlstnParties
数组中获取它的值。该数组从电子表格中获取它的值。
如果 party
属性 没有得到分配给它的正确值,我想知道 mlstnParties
数组是否有问题? mlstnParties
数组是一个二维数组。第一维是每一行,第二维是该行中所有值的数组。
这是我要质疑的代码行:
cliAllow[cliAllow.length-1].party = mlstnParties[0][mlstnCol];
行索引被硬编码为零。除了放入数组第一个索引的任何行之外,代码从不引用任何其他行。我认为您希望第一个索引参数是一个变化的变量。
基本上我想做的是从一个数组中获取一个对象,将 属性 附加到该对象,然后将该新对象推送到一个新数组。问题是,一旦我将该对象推送到新数组(使用新的、不同的 属性),它就会覆盖新数组中与该新对象具有相似属性的所有先前对象,尽管我更改了 属性 推送前。
应该是什么:
{propA: "Name", propB: "Age", propC: "Location1"}
{propA: "Name", propB: "Age", propC: "Location2"}
{propA: "Name", propB: "Age", propC: "Location3"}
变为:
{propA: "Name", propB: "Age", propC: "Location3"}
{propA: "Name", propB: "Age", propC: "Location3"}
{propA: "Name", propB: "Age", propC: "Location3"}
您可以在此处找到代码,相关行以黄色突出显示:http://pastie.org/private/ym8dbp1jpjwyrgbpdubk3a#47-52,59,67,85-86
这里是控制台输出,显示正确的信息被推送到 cliAllow
但正在被覆盖:http://pastie.org/private/g3480a91tr3jvhftxaclq
编辑: 这是 JSBin 中的简化版本:http://jsbin.com/kanibo/2/edit?js,console
我正在从我的旧代码重写这段代码,这是我第一次在 javascript 中编写,所以请原谅代码中其他地方可能不正确的编程方法。
非常感谢您的帮助。我已经尝试调试了将近一个星期,我已经精疲力尽了。
问题是您没有将对象的副本推送到数组 cliAllow
,而是将引用推送到同一对象。
所以让我们通过外部 while
循环的第一次迭代,看看结果是什么:
cliAllow.push(arr[4]);
cliAllow.push(arr[4]);
cliAllow.push(arr[4]);
现在,cliAllow.length
是 3,索引从 0 到 2,但是您有 3 个数组项指向同一个对象(notPassed
数组中的最后一个,因为您重新倒数。)
因此,cliAllow[0], cliAllow[1], cliAllow[2]
现在都引用同一个对象。
这意味着,当您设置 party
属性 时,您将同一个对象更改 3 次:
cliAllow[2].party = "NT";
cliAllow[1].party = "VL";
cliAllow[0].party = "LF";
你基本上是这样做的:
var obj = {milestone: "Mlstn4", client: "Client2", trade: "Trade3", units: "25.0", party: "B"};
obj.party = "NT";
obj.party = "VL";
obj.party = "LF";
如您所见,您在这里对同一个对象写入同一个 属性 3 次,这意味着它将被设置为您最后一次给它的值("LF"
这种情况)。
在您的代码中,notPassed
数组中有 5 个项目,但您只有 5 个而不是 15 个不同的对象,并且这 5 个对象中的每一个都获得其 party
属性 设置为 mlstnParties
数组中的最后一个值。
解决这个问题的一种方法是创建一个复制函数:
function copy(obj) {
var cp = {};
for (var o in obj) {
cp[o] = obj[o];
}
return cp;
}
在此处查看实际效果:http://jsbin.com/kibeba/2/edit
我写这篇文章是为了理解代码在做什么,并确认我理解它在做什么。
当我 运行 名为 gatherResponses()
的函数时,它将 65 个对象放入数组 notPassed
中(使用您提供的数据)。对象属性为:
{client:"Client 1", trade:"Batch 21", units:250, milestone:"Milestone 18", due:(new Date(1423803600000))}
然后那个名为 notPassed
的对象数组被传递给函数 checkThresholds()
然后 notPassed
数组(现在命名为 arr
)的元素(对象)被推入另一个名为 cliAllow
.
cliAllow[cliAllow.length] = arr[arrLen];
然后访问新数组中的特定对象并为 party
属性 分配一个值。
cliAllow[cliAllow.length-1].party = mlstnParties[0][mlstnCol];
while 循环正在从最大数倒数到零。因此,变量 arrLen
从最高数字变为零。这意味着数组正在从最后一个元素(最后一个对象)到第一个对象进行处理。它不起作用 "front to back",但从数组中的最后一个元素(对象)向后移动。
notPassed
数组中的原始对象中,没有party
属性。因此,添加的 party
属性。
party
属性 正在从 mlstnParties
数组中获取它的值。该数组从电子表格中获取它的值。
如果 party
属性 没有得到分配给它的正确值,我想知道 mlstnParties
数组是否有问题? mlstnParties
数组是一个二维数组。第一维是每一行,第二维是该行中所有值的数组。
这是我要质疑的代码行:
cliAllow[cliAllow.length-1].party = mlstnParties[0][mlstnCol];
行索引被硬编码为零。除了放入数组第一个索引的任何行之外,代码从不引用任何其他行。我认为您希望第一个索引参数是一个变化的变量。