比较 2 个 JSON 对象

IT技术 javascript json compare
2021-02-27 18:47:07

可能的重复:
JavaScript 中的对象比较

是否有任何方法可以接收 2 个 JSON 对象并比较这 2 个对象以查看是否有任何数据已更改?

编辑

在查看评论后,需要进行一些澄清。

  1. JSON 对象定义为

    "一组无序的名称/值对。一个对象以{(左括号)开始,以}(右括号)结束。每个名称后跟:(冒号),名称/值对用,(逗号)分隔.” -- json.org

  2. 我的目标是能够比较 2 个 JSON 对象文字,简单地说。

我不是 javascript 专家,所以如果在 javascript 中,这些是对象文字,那么我想这就是我应该称呼它们的原因。

我相信我正在寻找的是一种能够:

  1. 深度递归以找到唯一的名称/值对
  2. 确定两个对象文字的长度,并比较名称/值对以查看两者中是否存在差异。
1个回答

简单地解析 JSON 并比较两个对象是不够的,因为它不会是完全相同的对象引用(但可能是相同的值)。

你需要做一个深度等于。

来自http://threebit.net/mail-archive/rails-spinoffs/msg06156.html - 似乎使用 jQuery。

Object.extend(Object, {
   deepEquals: function(o1, o2) {
     var k1 = Object.keys(o1).sort();
     var k2 = Object.keys(o2).sort();
     if (k1.length != k2.length) return false;
     return k1.zip(k2, function(keyPair) {
       if(typeof o1[keyPair[0]] == typeof o2[keyPair[1]] == "object"){
         return deepEquals(o1[keyPair[0]], o2[keyPair[1]])
       } else {
         return o1[keyPair[0]] == o2[keyPair[1]];
       }
     }).all();
   }
});

Usage:

var anObj = JSON.parse(jsonString1);
var anotherObj= JSON.parse(jsonString2);

if (Object.deepEquals(anObj, anotherObj))
   ...
我认为以下行已损坏:if (typeof o1[..] == typeof o2[..] == "object")...因为第一次比较将返回一个布尔值。
2021-04-22 18:47:07
如果我错了,请纠正我,但我很确定这不是深度递归方法。在我看来,它只适用于 1 个级别。
2021-04-25 18:47:07
更新了函数以使用嵌套对象。
2021-04-28 18:47:07
来自哪个库k1.zip它似乎不在 jQuery 中。
2021-05-01 18:47:07
您应该在返回时使用 3 个等号,因为 1 == "1" 为真,但应该为假
2021-05-04 18:47:07