web-dev-qa-db-ja.com

2つのJSONオブジェクトを比較する

可能性のある複製:
JavaScriptでのオブジェクト比較

2つのJSONオブジェクトを受け取り、2つを比較してデータが変更されたかどうかを確認する方法はありますか?

編集

コメントを確認した後、いくつかの明確化が必要です。

  1. JSONオブジェクトは次のように定義されます

    「名前/値のペアの順序なしセット。オブジェクトは{(左中括弧)で始まり、}(右中括弧)で終わります。各名前の後には:(コロン)があり、名前/値のペアは、(コンマ)で区切られます」 - json.org

  2. 私の目標は、簡単に言えば、2つのJSONオブジェクトリテラルを比較できるようにすることです。

私はjavascriptの第一人者ではないので、javascriptでこれらがオブジェクトリテラルである場合、それを私はそれらを呼び出すべきだと思います。

私が探しているのは、以下が可能な方法だと思います:

  1. 一意の名前/値のペアを見つけるための深い再帰
  2. 両方のオブジェクトリテラルの長さを決定し、名前/値のペアを比較して、どちらかに矛盾があるかどうかを確認します。
47
user356808

JSONを解析して2つのオブジェクトを比較するだけでは、まったく同じオブジェクト参照ではないため(同じ値になる可能性があるため)、十分ではありません。

ディープイコールを行う必要があります。

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))
   ...
14
jd.