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))}
然后是名为