我有两个对象:oldObj
和newObj
。
oldObj
中的数据用于填充表单,而newObj
是用户更改该表单中的数据并提交的结果。
这两个物体都很深。它们具有对象或对象数组等属性-它们可以有n层深,因此diff算法需要递归。
现在,我不仅需要弄清楚从oldObj
到newObj
更改了什么(如添加/更新/删除),而且还需要知道如何最好地表示它。
到目前为止,我的想法是构建一个genericDeepDiffBetweenObjects
方法,该方法将返回形式{add:{...},upd:{...},del:{...}}
上的对象,但后来我想:以前一定有人需要这个。
所以…有没有人知道一个库或一段代码可以做到这一点,并且可能有更好的方式来表示差异(以一种仍然是JSON可序列化的方式)?
我想到了一个更好的方法来表示更新的数据,通过使用与newObj
相同的对象结构,但将所有属性值转换为表单上的对象:
{type: '<update|create|delete>', data: <propertyValue>}
因此,如果newObj.prop1 = 'new value'
和oldObj.prop1 = 'old value'
,它将设置returnObj.prop1 = {type: 'update', data: 'new value'}
当我们处理数组的属性时,它会变得非常麻烦,因为数组[1,2,3]
应该被计算为等于[2,3,1]
,这对于基于值的类型的数组,如string, int &Bool类型,但当涉及到对象和数组等引用类型的数组时,就很难处理了。
数组的示例应该是相等的:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
不仅要检查这种类型的深度值相等相当复杂,而且要找出一种表示可能发生的变化的好方法。