记录具有旧颜色/数字和新属性,可以更改。我想遍历一个数组并检查旧值和新值是否不匹配。如果他们不这样做,我想确定哪个属性被更改(颜色/数字),设置该记录的已更改属性,并将其推送到数组。如果记录的颜色和数量都有变化,我想要一个具有不同更改属性的每个数组条目的副本。
我尝试了几种不同的方法,无论我做什么,推送都会覆盖已更改的属性。我试图使用本地数组,但也没有用。这是一个例子。
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;
}]
答案 0 :(得分:1)
执行output.push('rec')
时,它不会在数组中放置 rec
的副本;它会在数组中放置rec
(或者更准确地说,是对rec
的引用)。
因此,在两个属性都已更改的情况下,您将rec.changed
设置为“color”,然后在数组中引用rec
,然后将rec.changed
设置为“number” ,然后在数组中添加rec
的另一个引用。一切都是针对单个对象实例完成的。
您打算做的是拥有两个对象,每个对象具有相同的id
,oldColor
,newColor
,oldNumber
和newNumber
;但具有不同的changed
值。 (这是否是最有效的方法可能会引起辩论,但这就是你所描述的预期结果。)为此,你必须复制rec
。
一种方法(使用vanilla 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)
);或者,如果创建了太多不需要的副本,您可以专门看到何时需要两个实例,然后再制作副本。