javascript - 推送到数组会覆盖相似的条目

标签 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 编写代码,因此请原谅代码中其他地方可能存在不正确的编程方法。

非常感谢您的帮助。我已经尝试调试这个问题近一周了,我已经精疲力尽了。

最佳答案

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

关于javascript - 推送到数组会覆盖相似的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508287/

相关文章:

javascript - 在 rxjs 中订阅变量

javascript - 测量 PhantomJS 中请求花费的时间

javascript - 未计算 div 的外部高度

google-apps-script - 是否可以将 Google Apps 脚本部署为不会在每次部署时更改 URL 的网络应用程序?

查询执行后Javascript变量被覆盖

javascript - jQuery 允许单击但不允许双击

javascript - 创建长度为 n 的空数组

google-apps-script - 使用 Google AppS 脚本替换 Google Docs 中的单词

google-apps-script - 如何允许 Google 应用制作工具应用访问而无需登录

javascript - 提高性能谷歌应用脚​​本将数据从多个电子表格复制到一个