Eu tenho dois objetos: oldObj
e newObj
.
Os dados oldObj
foram usados para preencher um formulário e newObj
são o resultado do usuário alterando os dados neste formulário e enviando-os.
Ambos os objetos são profundos, ie. eles têm propriedades que são objetos ou matrizes de objetos etc. - podem ter n níveis de profundidade, portanto o algoritmo diff precisa ser recursivo.
Agora eu preciso não apenas descobrir o que foi alterado (como adicionado / atualizado / excluído) de oldObj
para newObj
, mas também a melhor forma de representá-lo.
Até agora, meus pensamentos eram apenas construir um genericDeepDiffBetweenObjects
método que retornasse um objeto no formulário, {add:{...},upd:{...},del:{...}}
mas então pensei: alguém já deveria ter precisado disso antes.
Então ... alguém sabe de uma biblioteca ou de um código que fará isso e talvez tenha uma maneira ainda melhor de representar a diferença (de uma maneira que ainda seja serializável em JSON)?
Atualizar:
Eu pensei em uma maneira melhor de representar os dados atualizados, usando a mesma estrutura de objeto que newObj
, mas transformando todos os valores de propriedade em objetos no formulário:
{type: '<update|create|delete>', data: <propertyValue>}
Então, se newObj.prop1 = 'new value'
e oldObj.prop1 = 'old value'
definiriareturnObj.prop1 = {type: 'update', data: 'new value'}
Atualização 2:
Fica realmente complicado quando chegamos a propriedades que são matrizes, já que a matriz [1,2,3]
deve ser contada como igual a [2,3,1]
, o que é simples o suficiente para matrizes de tipos baseados em valor, como string, int e bool, mas fica realmente difícil de lidar quando se trata de matrizes de tipos de referência, como objetos e matrizes.
Matrizes de exemplo que devem ser encontradas iguais:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Não é apenas complexo verificar esse tipo de profunda igualdade de valores, mas também descobrir uma boa maneira de representar as mudanças que possam ser.
newObj
é gerado pelos valores de leitura de código js de um formulário no DOM. Existem várias maneiras de manter o estado e fazer isso com muito mais facilidade, mas eu gostaria de mantê-lo apátrida como exercício. Também estou procurando arte anterior para ver como os outros podem ter enfrentado isso, se é que alguém já o fez.