Ich habe ein selectedItem
Objekt in Angular, es enthält andere Objekte und Arrays. Ich erstelle eine tiefe Kopie eines JSON Trick:Wie JS-Objekt und alle Arrays und Objekte innerhalb durchlaufen, um es mit seiner Kopie zu vergleichen?
$scope.editableItem = JSON.parse(JSON.stringify($scope.selectedItem))
Dann benutze ich editableItem
Modell in Eingänge, innerhalb einige Werte ändern. selectedItem
ändert sich nicht. Dann möchte ich über PATCH
alle vorgenommenen Änderungen senden, aber nicht die Felder, die nicht geändert wurden. Also muss ich die editableItem
aus allen Feldern entfernen, die in unveränderten gleich sind.
Wie geht das effizient? Ich dachte daran, Objekte mit Underscore rekursiv zu durchlaufen, aber ich würde wirklich gerne wissen, ob es eine gute Denkweise ist, bevor ich es anwende.
Alternativ könnte ich wahrscheinlich dritte Objekt erstellen, das nur berührte Felder aus dem zweiten enthalten würde, dynamisch hinzugefügt, aber ich bin mir nicht sicher, wie ich das angehen soll.
EDITED: Um klar zu sein, erwarte ich, dass die Antwort generisch ist und die komplizierteste mögliche Objektstruktur annimmt. Zum Beispiel sind hier keine Antworten von this question anwendbar, da sie entweder annehmen, dass das Objekt nur einfache Felder aufweist, oder dass Angular Watcher explizit für jedes Feld separat gesetzt werden muss.
Wie möchten Sie Unterschiede in Arrays ausdrücken? Als Sparse-Arrays (die Sie nicht richtig in JSON konvertieren können)? – CherryDT
Guter Punkt. Ich schätze: Wenn es keinen Unterschied gibt, dann sende das Array überhaupt nicht. Wenn es einen Unterschied gibt, senden Sie das gesamte geänderte Array. Array als Ganzes ist ein Wert, der geändert und übergeben oder unverändert und nicht übergeben werden kann. – Senthe