我有两个对象: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:
当我们得到数组的属性时,它会变得非常毛茸茸,因为数组[1,2,3]应该被计算为等于[2,3,1],这对于基于值的类型的数组(如string,int和bool)来说非常简单,但是当涉及到它时,它实际上很难处理引用类型的数组,如对象和数组。
应该找到的示例数组相等:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
检查这种类型的深度值相等不仅非常复杂,而且还要找出一种表示可能的变化的好方法。
慕少森
相关分类