获得两个json对象的差异

场景:我想要一个比较两个JSON对象的函数,并返回一个带有差异列表的JSON对象,如果可能的话还有更多数据,如覆盖度量。

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"}]}; 

或类似的东西,你明白了。

有谁知道这个解决方案? 我已经找到了一个插件 ,但我想知道是否有其他选择。

这只是一个启动,我还没有测试它,但我开始使用filter或比较器function,这是递归的,但是需要更改它,但需要获得优先级结果。

 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(重命名/取消设置/设置)差异:

 // 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版本的改动。 这个工作在严格模式下并删除数组检查 – 将始终为false。 它还从diff中删除空节点。

  //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; }; 
Interesting Posts