Ich habe zwei Objekte: oldObj
und newObj
.
Die Daten in oldObj
wurden zum Auffüllen eines Formulars verwendet und newObj
sind das Ergebnis der Änderung und Übermittlung der Daten in diesem Formular durch den Benutzer.
Beide Objekte sind tief, dh. Sie haben Eigenschaften, die Objekte oder Arrays von Objekten usw. sind. Sie können n Ebenen tief sein, daher muss der Diff-Algorithmus rekursiv sein.
Jetzt muss ich nicht nur herauszufinden , was geändert wurde (wie in hinzugefügt / aktualisiert / gelöscht) aus oldObj
zu newObj
, sondern auch , wie man am besten repräsentieren sie.
Bisher dachte ich nur daran, eine genericDeepDiffBetweenObjects
Methode zu erstellen , die ein Objekt auf dem Formular {add:{...},upd:{...},del:{...}}
zurückgibt, aber dann dachte ich: Jemand anderes muss das schon einmal gebraucht haben.
Also ... kennt jemand eine Bibliothek oder einen Code, der dies tut und vielleicht eine noch bessere Möglichkeit hat, den Unterschied darzustellen (auf eine Weise, die immer noch JSON-serialisierbar ist)?
Aktualisieren:
Ich habe mir eine bessere Möglichkeit überlegt, die aktualisierten Daten darzustellen, indem ich dieselbe Objektstruktur wie verwende newObj
, aber alle Eigenschaftswerte in Objekte im Formular umwandle:
{type: '<update|create|delete>', data: <propertyValue>}
Also wenn newObj.prop1 = 'new value'
und oldObj.prop1 = 'old value'
es würde setzenreturnObj.prop1 = {type: 'update', data: 'new value'}
Update 2:
Es wird wirklich haarig, wenn wir zu Eigenschaften kommen, die Arrays sind, da das Array [1,2,3]
als gleich gezählt werden sollte [2,3,1]
, was für Arrays von wertbasierten Typen wie string, int & bool einfach genug ist, aber wirklich schwierig zu handhaben ist, wenn es darum geht Arrays von Referenztypen wie Objekte und Arrays.
Beispielarrays, die gleich gefunden werden sollten:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Es ist nicht nur recht komplex, nach dieser Art von tiefer Wertgleichheit zu suchen, sondern auch einen guten Weg zu finden, um die möglichen Änderungen darzustellen.
newObj
wird durch js Code generiert, der Werte aus einem Formular im DOM liest. Es gibt verschiedene Möglichkeiten, den Zustand beizubehalten und dies viel einfacher zu tun, aber ich möchte ihn als Übung staatenlos halten. Ich suche auch nach dem Stand der Technik, um zu sehen, wie andere dies angegangen sein könnten, wenn es tatsächlich jemand getan hat.