获取两个json的差异
场景:我想要一个比较两个JSON对象的函数,并返回一个带有差异列表的JSON对象,如果可能的话还有更多的数据,例如coverage指标。
var madrid = '{"type":"team","description":"Good","trophies":[{"ucl":"10"}, {"copa":"5"}]}';
var barca = '{"type":"team","description":"Bad","trophies":[{"ucl":"3"}]}';
如果我运行compare(madrid, barca)
返回的对象可能看起来像这样:
{"description" : "Bad", "trophies":[{"ucl":"3"}, {"copa":"5"}]};
或者类似的,你明白了。
有谁知道这个解决方案? 我已经找到了一个插件,但我想知道是否有其他选择。
这只是一个开始,我没有测试它,但我开始使用过滤器或比较器功能,这是递归的,改变它,但你需要获得优先结果。
function filter(obj1, obj2) {
var result = {};
for(key in obj1) {
if(obj2[key] != obj1[key]) result[key] = obj2[key];
if(typeof obj2[key] == 'array' && typeof obj1[key] == 'array')
result[key] = arguments.callee(obj1[key], obj2[key]);
if(typeof obj2[key] == 'object' && typeof obj1[key] == 'object')
result[key] = arguments.callee(obj1[key], obj2[key]);
}
return result;
}
测试:http://jsfiddle.net/gartz/Q3BtG/2/
您可以使用rus-diff https://github.com/mirek/node-rus-diff创建MongoDB兼容(重命名/未设置/设置)diff:
// npm install rus-diff
var madrid = {"type":"team","description":"Good","trophies":[{"ucl":"10"}, {"copa":"5"}]};
var barca = {"type":"team","description":"Bad","trophies":[{"ucl":"3"}]};
var rusDiff = require('rus-diff').rusDiff
console.log(rusDiff(madrid, barca))
输出:
{ '$unset': { 'trophies.1': true },
'$set': { description: 'Bad', 'trophies.0.ucl': '3' } }
回复我对Gabriel Gartz版本的更改。 这一个在严格模式下工作,并删除数组检查 - 将永远是错误的。 它还从差异中删除空节点。
//http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object
var isEmptyObject = function(obj) {
var name;
for (name in obj) {
return false;
}
return true;
};
//http://stackoverflow.com/questions/8431651/getting-a-diff-of-two-json-objects
var diff = function(obj1, obj2) {
var result = {};
var change;
for (var key in obj1) {
if (typeof obj2[key] == 'object' && typeof obj1[key] == 'object') {
change = diff(obj1[key], obj2[key]);
if (isEmptyObject(change) === false) {
result[key] = change;
}
}
else if (obj2[key] != obj1[key]) {
result[key] = obj2[key];
}
}
return result;
};
链接地址: http://www.djcxy.com/p/47115.html