繁体   English   中英

推送到阵列会覆盖相似的条目

[英]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 : cliAllow

编辑:这是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个项目,但是只有15个,而不是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从最高数变为零。 这意味着数组正在从最后一个元素(最后一个对象)到第一个对象进行处理。 它不是“从前到后”工作,而是从数组的最后一个到第一个元素(对象)向后倒退。

notPassed数组内的原始对象中,没有party属性。 因此,它添加了party属性。

party属性是从mlstnParties数组获取其值的。 该数组正在从电子表格中获取其价值。

如果没有给party属性分配正确的值,我想知道mlstnParties数组是否有问题? mlstnParties数组是一个二维数组。 第一维是每一行,第二维是该行中所有值的数组。

这是我要询问的代码行:

cliAllow[cliAllow.length-1].party = mlstnParties[0][mlstnCol];

行索引被硬编码为零。 除了将任何行放入数组的第一个索引之外,该代码从未引用任何其他行。 我认为您希望第一个索引参数是一个会更改的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM