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

このような関数を作成するのはそれほど難しくありません。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;
};

このデモページで動作を確認できます。

于 2012-04-27T21:10:23.093 に答える
3

ここでjson diffラッパーを見ることができます

デモページもあります。このラッパーを使用できます。

于 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 に答える