Eu tenho dois objetos: oldObje newObj.
Os dados oldObjforam usados para preencher um formulário e newObjsã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 oldObjpara newObj, mas também a melhor forma de representá-lo.
Até agora, meus pensamentos eram apenas construir um genericDeepDiffBetweenObjectsmé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.