Tengo dos objetos: oldObj
y newObj
.
Los datos oldObj
se utilizaron para completar un formulario y newObj
es el resultado de que el usuario haya cambiado los datos en este formulario y los haya enviado.
Ambos objetos son profundos, es decir. tienen propiedades que son objetos o matrices de objetos, etc., pueden tener n niveles de profundidad, por lo tanto, el algoritmo diff debe ser recursivo.
Ahora necesito no solo averiguar qué se cambió (como agregado / actualizado / eliminado) de oldObj
a newObj
, sino también cómo representarlo mejor.
Hasta ahora, mis pensamientos eran simplemente construir un genericDeepDiffBetweenObjects
método que devolviera un objeto en el formulario, {add:{...},upd:{...},del:{...}}
pero luego pensé: alguien más debe haber necesitado esto antes.
Entonces ... ¿alguien sabe de una biblioteca o un fragmento de código que haga esto y tal vez tenga una forma aún mejor de representar la diferencia (de una manera que todavía es serializable JSON)?
Actualizar:
He pensado en una mejor manera de representar los datos actualizados, utilizando la misma estructura de objeto newObj
, pero convirtiendo todos los valores de propiedad en objetos en el formulario:
{type: '<update|create|delete>', data: <propertyValue>}
Entonces, newObj.prop1 = 'new value'
y oldObj.prop1 = 'old value'
estableceríareturnObj.prop1 = {type: 'update', data: 'new value'}
Actualización 2:
Se vuelve realmente difícil cuando llegamos a las propiedades que son matrices, ya que la matriz [1,2,3]
debe contarse como igual a [2,3,1]
, que es lo suficientemente simple para las matrices de tipos basados en valores como string, int & bool, pero se vuelve realmente difícil de manejar cuando se trata de matrices de tipos de referencia como objetos y matrices.
Ejemplos de matrices que deberían ser iguales:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
No solo es bastante complejo verificar este tipo de igualdad de valores profundos, sino también encontrar una buena manera de representar los cambios que podrían ocurrir.
newObj
es generado por el código js que lee valores de un formulario en el DOM. Hay varias formas de mantener el estado y hacerlo mucho más fácil, pero me gustaría mantenerlo sin estado como ejercicio. También estoy buscando arte previo para ver cómo otros podrían haber abordado esto, si es que alguien lo ha hecho.