22

假设我有以下 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 的值。这就是为什么不返回“字段 E”及其值的原因。

如果可能想出一个返回包含已更改值的 json 对象的函数,最好的方法是什么?

我尝试了什么:我尝试通过手动指定我要检查的字段来进行比较,但我想要一些要求我不要硬编码“字段”的东西,因为它效率很低而且每次我添加JSON B 的一个新字段,我必须在我正在寻找的字段中进行硬编码......这就是为什么我正在寻找不那么痛苦的东西。

4

4 回答 4

20

创建这样的函数并不难。只需遍历第二个对象中的每个字段,如果它不存在于第一个对象中或值与第一个对象不同,则将该字段放入返回对象中。

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

您可以在此演示页面上看到它的实际效果。

于 2012-04-27T21:10:23.093 回答
3

您可以在这里查看 json diff wrapper

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

于 2012-04-27T21:12:01.983 回答
3

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

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

还将它扩展到深层嵌套对象。

isEmpty 

可以通过多种方式完成。请参阅 对象是否为空?

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; 
}; 
于 2012-11-15T00:46:08.260 回答
1

在彼得奥尔森的回答中,它不会检查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; 
    }; 
于 2019-05-16T06:44:25.663 回答