2017-02-28 7 views
2

JavaScriptを初めて使い、2つのJSONオブジェクトの違いを見つけようとしています。 JSONオブジェクトの構造とそのデータを以下に示します。私は通常のJSONオブジェクトのために動作するコードをオンラインにしていますが、これもデータの配列を持っているので、そのためにはうまくいかないと思います。私は別のものを試みたが、結果は得られなかった。あなたがこれについての指針を持っているなら、それは非常に高く評価されるでしょう。ありがとう。2つのJSONオブジェクトを比較し、変更だけで別のJSONオブジェクトを返す

JSONオブジェクト1(OBJ1):{id: 1, details: Array[2], profession: "Business"}

{ 
    "id": "1", 
    "details": [{ 
     "name": "Peter", 
     "address": "Arizona", 
     "phone": 9900998899 
    }, 
    { 
     "name": "Jam", 
     "address": "Kentucky", 
     "phone": 56034033343 
    } 
    ], 
    "profession": "Business" 
} 

JSONオブジェクト2(OBJ2):{id: 2, details: Array[2], profession: "Business"}

{ 
    "id": "2", 
    "details": [{ 
     "name": "Peter", 
     "address": "Arizona", 
     "phone": 9900998899 
    }, 
    { 
     "name": "David", 
     "address": "Boston", 
     "phone": 434323434 
    } 
    ], 
    "profession": "Business" 
} 

対処:

compare(obj1, obj2) { 

    var result = {}; 

    for (key in obj1) { 
    if (obj2[key] != obj1[key]) { 
     result[key] = obj2[key]; 
    } 
    if (typeof obj2[key] === '[object Array]' && typeof obj1[key] === '[object Array]') { 
     result[key] = compare(obj1[key], obj2[key]); 
    } 
    if (typeof obj2[key] === 'object' && typeof obj1[key] === 'object') { 
     result[key] = compare(obj1[key], obj2[key]); 
    } 
    } 
    console.log(result); 
} 

結果:予想

Object {0: undefined, 1: undefined} 
Object {id: "2", pingedAddresses: undefined, type: "Business"} 

{ 
    "id": "2", 
    "details": [{ 
    "name": "David", 
    "address": "Boston", 
    "phone": 434323434 
    }] 
} 
+3

[「JSONオブジェクト」のようなものはありません](http://benalman.com/news/2010/03/theres-no-suchthing-as-a-json/) – Andreas

+1

'[オブジェクト配列]'をタイプとして返​​します。それを得るには、 'Object.prototype.toString.apply(obj)'をしなければなりません。配列をチェックしたい場合は 'Array 'を使います。isArray' – Rajesh

+0

あなたができるならばアンダースコア(またはあなたが好む他のライブラリ)を使用することを検討してください。あなたの仕事がそれを発明しない限り、ホイールを発明する必要はありません – Tebe

答えて

2

あなたは、単純な比較として、次のことを試すことができます。これを参考にして、構造が異なる場合にはより汎用的にすることができます。考慮すべき

ポイント:項目の

  • 番号が異なっています。 o1.detailsには2つのエントリがあり、o2.detailsには5つのエントリがあります。
  • オブジェクトの構造が異なります。両方のオブジェクトのプロパティが異なります。

function getDifference(o1, o2) { 
 
    var diff = {}; 
 
    var tmp = null; 
 
    if (JSON.stringify(o1) === JSON.stringify(o2)) return; 
 

 
    for (var k in o1) { 
 
    if (Array.isArray(o1[k]) && Array.isArray(o2[k])) { 
 
     tmp = o1[k].reduce(function(p, c, i) { 
 
     var _t = getDifference(c, o2[k][i]); 
 
     if (_t) 
 
      p.push(_t); 
 
     return p; 
 
     }, []); 
 
     if (Object.keys(tmp).length > 0) 
 
     diff[k] = tmp; 
 
    } else if (typeof(o1[k]) === "object" && typeof(o2[k]) === "object") { 
 
     tmp = getDifference(o1[k], o2[k]); 
 
     if (tmp && Object.keys(tmp) > 0) 
 
     diff[k] = tmp; 
 
    } else if (o1[k] !== o2[k]) { 
 
     diff[k] = o2[k] 
 
    } 
 
    } 
 
    return diff; 
 
} 
 

 
var o1={id:"1",details:[{name:"Peter",address:"Arizona",phone:9900998899},{name:"Jam",address:"Kentucky",phone:56034033343}],profession:"Business"}, 
 
o2={id:"2",details:[{name:"Peter",address:"Arizona",phone:9900998899},{name:"David",address:"Boston",phone:434323434}],profession:"Business"}; 
 

 
var d = getDifference(o1, o2) 
 
console.log(d)

私は答えto detect changes in objectsを書いていました。これも参考にすることができます。

0

あなたは最初のオブジェクトをループするために実行する2つ目はそれを持っているかいないかどうかを確認する必要があります。そして、新しい第三の目的にそれを保存します。

注:この答えはまったく同じであることを前提とした構造を

var obj3={}; 
for (var key in obj1) 
{ 
    !obj2.hasOwnProperty(key) && obj3[key]=obj[key]; 

} 
+0

obj2にはobj1よりも多くのメンバーが必要であることを忘れないでください。 – AHBagheri

関連する問題