两个对象之间的通用深度差异
我有两个对象:和 。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'}
更新 2:
当我们到达数组的属性时,它变得非常毛茸茸的,因为数组应该被计算为等于 ,这对于基于值的类型(如字符串,int和bool)的数组来说非常简单,但是当涉及到对象和数组等引用类型的数组时,处理起来非常困难。[1,2,3]
[2,3,1]
应找到相等的示例数组:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
不仅要检查这种类型的深度价值相等性,而且要找出一种表达可能变化的好方法。