Ho due oggetti: oldObj
enewObj
.
I dati in sono oldObj
stati utilizzati per popolare un modulo ed newObj
è il risultato dell'utente che modifica i dati in questo modulo e li invia.
Entrambi gli oggetti sono profondi, vale a dire. hanno proprietà che sono oggetti o matrici di oggetti ecc. - possono avere n livelli di profondità, quindi l'algoritmo diff deve essere ricorsivo.
Ora ho bisogno non solo di capire cosa è stato modificato (come in aggiunto / aggiornato / cancellato) da oldObj
a newObj
, ma anche di come rappresentarlo al meglio.
Finora il mio pensiero era solo quello di costruire un genericDeepDiffBetweenObjects
metodo che avrebbe restituito un oggetto sul modulo, {add:{...},upd:{...},del:{...}}
ma poi ho pensato: qualcun altro doveva averne bisogno prima.
Quindi ... qualcuno conosce una libreria o un pezzo di codice che lo farà e forse ha un modo ancora migliore di rappresentare la differenza (in un modo che è ancora serializzabile JSON)?
Aggiornare:
Ho pensato a un modo migliore per rappresentare i dati aggiornati, usando la stessa struttura di oggetti newObj
, ma trasformando tutti i valori delle proprietà in oggetti nel modulo:
{type: '<update|create|delete>', data: <propertyValue>}
Quindi se newObj.prop1 = 'new value'
e oldObj.prop1 = 'old value'
sarebbe impostatoreturnObj.prop1 = {type: 'update', data: 'new value'}
Aggiornamento 2:
Diventa veramente peloso quando arriviamo a proprietà che sono array, poiché l'array [1,2,3]
dovrebbe essere considerato uguale a [2,3,1]
, che è abbastanza semplice per array di tipi basati su valore come string, int & bool, ma diventa davvero difficile da gestire quando si tratta di matrici di tipi di riferimento come oggetti e matrici.
Matrici di esempio che dovrebbero essere trovate uguali:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Non solo è abbastanza complesso verificare questo tipo di uguaglianza di valore profondo, ma anche trovare un buon modo per rappresentare i cambiamenti che potrebbero essere.
newObj
viene generato dal codice js che legge i valori da un modulo nel DOM. Esistono diversi modi per mantenere lo stato e farlo molto più facilmente, ma mi piacerebbe mantenerlo apolide come esercizio. Inoltre sto cercando arte nota per vedere come altri avrebbero potuto affrontare questo, se davvero qualcuno lo ha fatto.