gpt4 book ai didi

javascript - 数组推送覆盖

转载 作者:行者123 更新时间:2023-12-03 05:43:47 25 4
gpt4 key购买 nike

记录具有旧的颜色/编号和新的属性,可以更改。我想循环遍历一个数组并检查旧值和新值是否不匹配。如果没有,我想确定哪个属性被更改(颜色/数字),设置该记录的更改属性,并将其推送到数组中。如果记录的颜色和数字均发生更改,我需要具有不同更改属性的每个数组条目的副本。

我尝试了几种不同的方法,无论我做什么,推送都会覆盖更改的属性。我尝试过使用本地数组,但也没有成功。这是一个例子。

 export class Record {
id: string;
oldcolor: string;
newcolor: string;
oldnumber: string;
newnumber: string;
changed: string;
}




@Input() newrecords: Record[];
output: Record[] = [];

functionTest() {

for (let rec of this.newrecords) {


if (rec.newcolor != rec.oldcolor) {

rec.changed = "color";
output.push(rec);


}

if (rec.newnumber != rec.oldnumber) {

rec.changed = "number";
output.push(rec);

}


}
}


desired result
[{
id: 1;
oldcolor: red;
newcolor: red;
oldnumber: 6;
newnumber: 6;
changed: color;
},
{
id: 1;
oldcolor: red;
newcolor: red;
oldnumber: 6;
newnumber: 6;
changed: number;
}]

最佳答案

当你这样做时output.push('rec')它不会放置 rec副本在数组中;它放置rec (或者更准确地说,是对数组中 rec 的引用)。

因此,在两个属性都发生更改的情况下,您设置 rec.changed到“颜色”,然后引用 rec在数组中,然后设置 rec.changed到“数字”,然后再引用 rec在数组中。一切都针对单个对象实例完成。

您想要做的是拥有两个对象,每个对象都有相同的 id , oldColor , newColor , oldNumber ,和newNumber ;但不同changed值(value)观。 (这是否是最有效的方法可能有争议,但这就是您所描述的期望结果。)为此,在某些时候您必须复制 rec .

实现此目的的一种方法(使用普通 JavaScript):

var copy = {
id: rec.id,
oldColor: rec.oldColor,
newColor: rec.newColor,
oldNumber: rec.oldNumber,
newNumber: rec.newNumber,
changed: rec.changed
}

您可以在每次推送之前执行此操作(然后使用 push(copy) 而不是 push(rec) );或者,如果这创建了太多不需要的副本,您可以具体查看何时需要两个实例,然后仅在那时创建副本。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com