考虑以下函数的蓝图,它试图比较两个对象:
function objectCompare(a,b,path){
for (var prop in a) {
path=prop;
if (a.hasOwnProperty(prop) && !(b.hasOwnProperty(prop))) {
...
return false;
}
...
if (detectType(a[prop])==='Object'){
if (!objectCompare(a[prop],b[prop],path))
return false;
}
...
}
return true;
}
detectType
是我自己的函数,用于检查变量的类型。我的问题是,每次我们进行递归调用时,我都希望丰富变量path
。但是,在递归调用完成的同时,path
必须遍历初始对象的剩余属性名称而不会被丰富...
想象一下以下对象:
var Obj1 = {
p1: 's',
p2: {
p1: {a: { propA: 'a', propB: 'b' }},
p2: 'g',
}
};
var Obj2 = {
p1: 's',
p2: {
p1: {a: { propA: 'a', propB: 'c' }},
p2: 'g',
}
};
当函数path
返回时,我希望objectCompare
具有以下值:p2.p1.a.propB
即,使两个对象不同的点。我怎么能实现这个目标呢?
答案 0 :(得分:1)
您必须将当前密钥添加到路径并将新路径传递给递归调用。考虑:
browserHistory
答案 1 :(得分:0)
图书馆deep-diff
可以满足您的需求。
以上参考文献提供了此示例代码:
var diff = require('deep-diff').diff;
var lhs = {
name: 'my object',
description: 'it\'s an object!',
details: {
it: 'has',
an: 'array',
with: ['a', 'few', 'elements']
}
};
var rhs = {
name: 'updated object',
description: 'it\'s an object!',
details: {
it: 'has',
an: 'array',
with: ['a', 'few', 'more', 'elements', { than: 'before' }]
}
};
var differences = diff(lhs, rhs);
上面的代码片段会产生以下描述差异的结构:
[ { kind: 'E',
path: [ 'name' ],
lhs: 'my object',
rhs: 'updated object' },
{ kind: 'E',
path: [ 'details', 'with', 2 ],
lhs: 'elements',
rhs: 'more' },
{ kind: 'A',
path: [ 'details', 'with' ],
index: 3,
item: { kind: 'N', rhs: 'elements' } },
{ kind: 'A',
path: [ 'details', 'with' ],
index: 4,
item: { kind: 'N', rhs: { than: 'before' } } } ]
值得注意的是path
属性与您想要的输出非常相似。