Problem:
Sie müssen zwei tief verschachtelte Objekte (oldObj und newObj) vergleichen ) und identifizieren Sie die Unterschiede zwischen ihnen, einschließlich Änderungen, Hinzufügungen und Löschungen. Die Herausforderung besteht darin, diese Unterschiede auf sinnvolle und JSON-serialisierbare Weise darzustellen, insbesondere wenn Arrays beteiligt sind.
Lösung:
Erstellen eines generischen Deep Diff Algorithmus:
Erwägen Sie die Entwicklung einer generischen DeepDiffBetweenObjects-Methode, die ein Objekt der Form {add: {...}, upd: {...}, del: {...}} zurückgibt. Dies würde eine grundlegende Darstellung der Änderungen liefern.
Verbesserte Datendarstellung:
Für einen umfassenderen Ansatz sollten Sie erwägen, die gleiche Objektstruktur wie newObj zu verwenden, aber alle Eigenschaften zu konvertieren Werte in Objekte der Form {Typ:
Umgang mit Array-Vergleichen:
Arrays stellen eine einzigartige Herausforderung dar, da die Reihenfolge der Elemente auf Gleichheit geachtet werden muss. Eine ausgefeilte Lösung würde Arrays wertbasierter Typen wie Zeichenfolgen, Ganzzahlen und Boolesche Werte unabhängig von der Reihenfolge als gleich behandeln. Arrays von Referenztypen wie Objekte und Arrays erfordern jedoch eine komplexere Vergleichslogik.
Beispielimplementierung:
Hier ist ein Ausschnitt einer Klasse, die den vorgeschlagenen Algorithmus implementiert und kann angepasst werden, um unterschiedliche Wertevergleichsanforderungen zu erfüllen:
var deepDiffMapper = { VALUE_CREATED: 'created', VALUE_UPDATED: 'updated', VALUE_DELETED: 'deleted', VALUE_UNCHANGED: 'unchanged', map: function(obj1, obj2) { if (this.isFunction(obj1) || this.isFunction(obj2)) { throw 'Invalid argument. Function given, object expected.'; } if (this.isValue(obj1) || this.isValue(obj2)) { return { type: this.compareValues(obj1, obj2), data: obj1 === undefined ? obj2 : obj1 }; } ... }, ... };
Beispielverwendung:
var result = deepDiffMapper.map({ a: 'i am unchanged', b: 'i am deleted', ... }, { a: 'i am unchanged', c: 'i am created', ... }); console.log(result);
Schlussfolgerung:
Dieser Ansatz bietet eine robuste und anpassbare Möglichkeit, einen umfassenden Objektvergleich durchzuführen und die Unterschiede klar und JSON-serialisierbar darzustellen. Es kann je nach Bedarf erweitert werden, um komplexere Wertevergleichsanforderungen oder alternative Datendarstellungsformate zu bewältigen.
Das obige ist der detaillierte Inhalt vonWie führt man einen tiefen Objektvergleich und eine Transformation in JavaScript durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!