J'ai deux objets: oldObj
et newObj
.
Les données dans ont oldObj
été utilisées pour remplir un formulaire et newObj
sont le résultat de la modification des données de l'utilisateur dans ce formulaire et de leur soumission.
Les deux objets sont profonds, ie. ils ont des propriétés qui sont des objets ou des tableaux d'objets, etc. - ils peuvent avoir une profondeur de n niveaux, donc l'algorithme diff doit être récursif.
Maintenant , je dois non seulement comprendre ce qui a changé (comme ajoutée / mise à jour / supprimé) de oldObj
la newObj
, mais aussi la meilleure façon de le représenter.
Jusqu'à présent, je pensais simplement construire une genericDeepDiffBetweenObjects
méthode qui retournerait un objet sur le formulaire, {add:{...},upd:{...},del:{...}}
mais j'ai pensé: quelqu'un d'autre devait en avoir besoin auparavant.
Alors ... quelqu'un connaît-il une bibliothèque ou un morceau de code qui fera cela et peut-être a-t-il une meilleure façon de représenter la différence (d'une manière qui est encore sérialisable JSON)?
Mettre à jour:
J'ai pensé à une meilleure façon de représenter les données mises à jour, en utilisant la même structure d'objet que newObj
, mais en transformant toutes les valeurs de propriété en objets sur le formulaire:
{type: '<update|create|delete>', data: <propertyValue>}
Donc , si newObj.prop1 = 'new value'
et oldObj.prop1 = 'old value'
il fixeraitreturnObj.prop1 = {type: 'update', data: 'new value'}
Mise à jour 2:
Cela devient vraiment poilu lorsque nous arrivons à des propriétés qui sont des tableaux, car le tableau [1,2,3]
doit être compté comme égal à [2,3,1]
, ce qui est assez simple pour les tableaux de types basés sur des valeurs comme string, int & bool, mais devient vraiment difficile à gérer en ce qui concerne tableaux de types de référence comme des objets et des tableaux.
Exemples de tableaux qui doivent être trouvés égaux:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Non seulement il est assez complexe de vérifier ce type d'égalité de valeur profonde, mais aussi de trouver un bon moyen de représenter les changements qui pourraient être.
newObj
est généré par le code js qui lit les valeurs d'un formulaire dans le DOM. Il y a plusieurs façons de garder l'état et de le faire beaucoup plus facilement, mais j'aimerais le garder apatride comme exercice. Je suis également à la recherche d'antériorités pour voir comment d'autres auraient pu résoudre ce problème, si quelqu'un l'a fait.