比较 2 个 JSON 对象

2022-01-25 00:00:00 json compare javascript

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

是否有任何方法可以接收 2 个 JSON 对象并比较这两个对象以查看是否有任何数据发生变化?

Is there any method that takes in 2 JSON objects and compares the 2 to see if any data has changed?

编辑

查看评论后,需要澄清一下.

After reviewing the comments, some clarification is needed.

  1. 一个 JSON 对象被定义为

  1. A JSON object is defined as

一组无序的名称/值对.对象以 { 开头(左大括号)并以 }(右大括号)结尾.每个名称后跟:(冒号)和名称/值对由 , 分隔(逗号)." -- json.org

"an unordered set of name/value pairs. An object begins with { (left brace) and ends with } (right brace). Each name is followed by : (colon) and the name/value pairs are separated by , (comma)." -- json.org

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

  • My goal is to be able to compare 2 JSON object literals, simply put.

    我不是 javascript 专家,所以如果在 javascript 中这些是对象字面量,那么我想我应该这样称呼它们.

    I am not a javascript guru so if, in javascript, these are object literals, then I suppose that's what I should call them.

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

    I believe what I am looking for is a method capable of:

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

    推荐答案

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

    Simply parsing the JSON and comparing the two objects is not enough because it wouldn't be the exact same object references (but might be the same values).

    你需要做一个深度相等.

    You need to do a deep equals.

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

    From http://threebit.net/mail-archive/rails-spinoffs/msg06156.html - which seems the use 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))
       ...
    
  • 相关文章