记录具有旧的颜色/数字和新的属性,可以更改。我想遍历一个数组并检查旧值和新值是否不匹配。如果没有,我想确定哪个属性已更改(颜色/数字),设置该记录的更改属性,然后将其推入数组。如果记录的颜色和数字均发生更改,则我希望每个数组条目都具有一个不同的change属性副本。

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

 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进行引用在数组中。一切都在单个对象实例上完成。

您的意思是有两个对象,每个对象都具有相同的idoldColornewColoroldNumbernewNumber;但具有不同的changed值。 (这是否是最有效的方法尚有待商debate,但这就是您所描述的期望结果。)要做到这一点,必须在某个时候复制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/

10-13 00:45