Javascript JSON比较/差异?

时间:2012-04-27 21:05:20

标签: javascript

说我有以下2个json对象:

JSON A:
{
"Field A":"1",
"Field B":"2",
"Field D":"Something",
"Field E":"6"
}

JSON B:
{
"Field A":"1",
"Field B":"2",
"Field C":"3",
"Field D":"Different"
}

示例功能:     function(jsonstringA,jsonstringB)

示例(如果JSON A和JSON B用作参数):

返回一个包含以下内容的新JSON对象:

{
"Field C":"3", // because function sees jsonstringB had no "Field C"
"Field D": "Different" // sees jsonstringB had a different value for "Field D"
}

请注意,它使用jsonstringA作为比较的基础,因此该函数仅返回缺少的字段和jsonStringB的值。这就是为什么“Field E”及其价值不会被退回的原因。

如果可能的话,最好的方法是找到一个返回包含已更改值的json对象的函数?

我做了什么: 我已经尝试通过手动指定我要检查的字段来进行比较,但是我希望有一些东西要求我不要对“字段”进行硬编码,因为它非常低效并且每次我向JSON添加一个新字段B,我必须在我正在寻找的领域进行硬编码......这就是为什么我在寻找一种不那么痛苦的东西。

5 个答案:

答案 0 :(得分:13)

创建这样的功能并不难。只需循环遍历第二个对象中的每个字段,如果它不在第一个对象中,或者该值与第一个不同,则将该字段放在返回对象中。

var compareJSON = function(obj1, obj2) {
  var ret = {};
  for(var i in obj2) {
    if(!obj1.hasOwnProperty(i) || obj2[i] !== obj1[i]) {
      ret[i] = obj2[i];
    }
  }
  return ret;
};

您可以在this demo page上看到它。

答案 1 :(得分:3)

您可以查看json diff wrapper here

它还有演示页面。你可以使用这个包装器。

答案 2 :(得分:2)

该函数,正如我所追求的那样对非JSON对象比较也很有用

http://jsfiddle.net/muJEu/11/

还为深层嵌套对象扩展了它。

isEmpty 

可以通过多种方式完成。见Is object empty?

var compareObj = function(obj1, obj2) { 
  var ret = {},rett; 
  for(var i in obj2) { 
      rett = {};  
      if (typeof obj2[i] === 'object'){
          rett = compareObj (obj1[i], obj2[i]) ;
          if (!isEmpty(rett) ){
           ret[i]= rett
          }              
       }else{
           if(!obj1 || !obj1.hasOwnProperty(i) || obj2[i] !== obj1[i]) { 
              ret[i] = obj2[i]; 
      } 
   }
  } 
  return ret; 
}; 

答案 3 :(得分:0)

在彼得·奥尔森(Peter Olson)的答案中,它不会检查array的值,为了解决该问题,我修改了这样的解决方案。

var compareJSON = function(obj1, obj2) { 
      var ret = {}; 
      for(var i in obj2) { 
        if(!obj1.hasOwnProperty(i) || obj2[i] !== obj1[i]) {
          if(!Array.isArray(obj2[i]) || !(JSON.stringify(obj2[i]) == JSON.stringify(obj1[i]))){
          ret[i] = obj2[i];
          }
        } 
      } 
      return ret; 
    }; 

答案 4 :(得分:0)

如果obj2的属性等于obj1的属性,则此解决方案不起作用,但是obj1具有更多的属性。