Javascript JSON比较/差异?

新手上路,请多包涵

假设我有以下 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 的一个新字段,我必须在我正在寻找的字段中进行硬编码……这就是为什么我正在寻找不那么痛苦的东西。

原文由 Rolando 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 599
2 个回答

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

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

您可以在 此演示页面 上看到它的运行情况。

原文由 Peter Olson 发布,翻译遵循 CC BY-SA 3.0 许可协议

该函数,正是我所追求的,对于非 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;
};

原文由 Steve Black 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏