2016-11-03 3 views
0

Ein Datensatz hat eine alte Farbe/Nummer und neue Eigenschaften, die geändert werden können. Ich möchte ein Array durchlaufen und überprüfen, ob die alten und neuen Werte nicht übereinstimmen. Wenn dies nicht der Fall ist, möchte ich feststellen, welche Eigenschaft geändert wurde (Farbe/Anzahl), die geänderte Eigenschaft dieses Datensatzes festlegen und sie in ein Array verschieben. Wenn der Datensatz sowohl für Farbe als auch für Nummer geändert wird, möchte ich eine Kopie jedes Arrayeintrags mit der geänderten Eigenschaft.Array-Überschreiben

Ich habe ein paar verschiedene Möglichkeiten ausprobiert und der Push überschreibt die geänderte Eigenschaft, egal was ich mache. Ich habe versucht, ein lokales Array zu verwenden, und das hat auch nicht geklappt. Hier ist ein Beispiel.

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

Antwort

1

Wenn Sie output.push('rec') tun es führt zu keiner Kopierec in der Anordnung; Es platziert rec (oder, genauer gesagt, eine Referenz auf rec) im Array.

So in dem Fall, in dem beide Eigenschaften geändert haben, setzen Sie rec.changed auf „Farbe“, dann einen Verweis auf rec im Array setzen, stellen Sie dann rec.changed auf „Nummer“, dann einen weiteren Hinweis auf rec im Array setzen. Alles wird für eine einzige Objektinstanz ausgeführt.

Was Sie zu tun war, bedeutete zwei Objekte haben, die jeweils mit der gleichen id, oldColor, newColor, oldNumber und newNumber; aber mit anderen changed Werten. (Ob dies der effizienteste Ansatz ist, ist vielleicht offen für Diskussionen, aber das haben Sie als das gewünschte Ergebnis beschrieben.) Um das zu tun, müssen Sie irgendwann eine Kopie von rec erstellen.

Eine Möglichkeit, diese (mit Vanille JavaScript) zu tun:

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

du vor jedem Stoß tun könnte (und dann push(copy) statt push(rec)); oder wenn dies zu viele unnötige Kopien erzeugt, können Sie genau sehen, wenn Sie zwei Instanzen benötigen, und erst dann eine Kopie erstellen.

+0

Dank Mark, das hat funktioniert. Was sind einige der effizienteren Möglichkeiten, die Sie erwähnt haben? – meli02

+0

Nun, ich spekuliere wirklich, denke ich ... es hängt davon ab, was Sie mit dem Array tun, sobald Sie es erstellt haben. Wenn Sie beispielsweise den Datenspeicher für ein UI-Grid bereitstellen, der die Daten auf eine bestimmte Weise anzeigen muss, gibt es möglicherweise keine andere Möglichkeit. OTOH, wenn Sie dies für die Verarbeitung in eine Funktion übergeben, die Sie steuern, und könnte daher die Struktur beliebig definieren, zum Beispiel mit einem Wert für 'changed = 'both''; oder wenn der Wert von 'changed' ein Array ist (' changed: ["color", "number"] ') könnte die Verarbeitung (zum Kopieren von Objekten) und der Speicher (zum Speichern der Kopien) gespeichert werden. –