推送到数组会覆盖类似的条目

时间:2015-02-13 20:33:58

标签: javascript google-apps-script

基本上我要做的是从一个数组中获取一个对象,将一个属性附加到该对象,然后将该新对象推送到一个新数组。问题是,一旦我将该对象推送到新数组(使用新的不同属性),它会覆盖新数组中与此新对象具有相似属性的所有先前对象,尽管我在推送之前改变了属性。

应该是什么:

{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编写代码,所以请原谅代码中其他地方可能有不正确的编程方法。

非常感谢您的帮助。我已经试着调试了将近一个星期而且我已经筋疲力尽了。

2 个答案:

答案 0 :(得分:3)

问题在于您没有将对象的副本推送到数组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

答案 1 :(得分:1)

我写这篇文章是为了了解代码的作用,并确认我理解它在做什么。

当我运行名为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];

行索引硬编码为零。除了放入数组第一个索引的行之外,代码永远不会引用任何其他行。我认为你会希望第一个索引参数是一个变化的变量。