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