首页 文章

阵列推送覆盖

提问于
浏览 1077
0

记录具有旧的颜色/数字和新属性,可以更改 . 我想遍历一个数组并检查旧值和新值是否不匹配 . 如果他们不这样做,我想确定哪个属性被更改(颜色/数字),设置该记录的已更改属性,并将其推送到数组 . 如果记录的颜色和数量都有变化,我想要一个具有不同更改属性的每个数组条目的副本 .

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

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;
}]

1 回答

  • 1

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

    因此,在两个属性都已更改的情况下,将 rec.changed 设置为"color",然后在数组中引用 rec ,然后将 rec.changed 设置为"number",然后在数组中添加对 rec 的另一个引用 . 一切都是针对单个对象实例完成的 .

    你打算做的是有两个对象,每个对象都有相同的 idoldColornewColoroldNumbernewNumber ;但具有不同的 changed 值 . (是否's the most efficient approach may be open to debate, but that' s你所描述的是期望的结果 . )为此,你必须在某一时刻复制 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) );或者,如果创建了太多不需要的副本,您可以专门看到何时需要两个实例,然后再制作副本 .

相关问题