Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 推送到数组会覆盖类似的条目_Javascript_Google Apps Script - Fatal编程技术网

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

Javascript 推送到数组会覆盖类似的条目,javascript,google-apps-script,Javascript,Google Apps Script,基本上,我要做的是从一个数组中获取一个对象,将一个属性附加到该对象,然后将该新对象推送到一个新数组中。问题是,一旦我将该对象推送到新数组(使用新的、不同的属性),它将覆盖新数组中与该新对象具有类似属性的所有以前的对象,尽管我在推之前更改了属性 应该是什么: {propA: "Name", propB: "Age", propC: "Location1"} {propA: "Name", propB: "Age", propC: "Location2"} {propA: "Name", propB

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

应该是什么:

{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"}
在这里您可以找到代码,相关行以黄色突出显示:

以下是控制台输出,显示正确的信息正被推送到
cliAllow
,但被覆盖:

编辑:以下是JSBin中的简化版本:

我正在从我第一次用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个不同的对象,而是只有5个,这5个对象中的每一个都将其
party
属性设置为
mlstnParties
数组中的最后一个值

解决此问题的一种方法是创建复制函数:

function copy(obj) {
  var cp = {};
  for (var o in obj) {
      cp[o] = obj[o];
  }
  return cp;
}

查看此处的操作:

问题在于您没有将对象的副本推送到数组
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个不同的对象,而是只有5个,这5个对象中的每一个都将其
party
属性设置为
mlstnParties
数组中的最后一个值

解决此问题的一种方法是创建复制函数:

function copy(obj) {
  var cp = {};
  for (var o in obj) {
      cp[o] = obj[o];
  }
  return cp;
}

在这里查看它的实际操作:

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

当我运行名为
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
属性正在从
mlstnParties
数组获取其值。该数组正在从电子表格中获取其值


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

这是我要质疑的一行代码:

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

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

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

当我运行名为
gatherResponses()
的函数时,它将65个对象放入数组
notPassed
(使用您提供的数据)。对象属性包括:

{client:"Client 1", trade:"Batch 21", units:250, milestone:"Milestone 18", due:(new Date(1423803600000))}
然后是名为