2017-02-28 156 views
2

我是JavaScript新手,試圖找出兩個JSON對象之間的區別。 JSON對象的結構及其數據如下所示。我在線獲得了一個適用於普通JSON對象的代碼,但由於它也有一組數據,我認爲它不適用於此。我嘗試了不同的東西,但沒有結果。如果你有這方面的指針,將不勝感激。謝謝。比較兩個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-such-thing-as-a-json/) – Andreas

+1

你永遠不會得到'[object array]'作爲類型。要做到這一點,你必須做'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

您需要在第一對象循環運行,並檢查第二個是否具有與否。然後將其保存到一個新的第三個目的:

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

} 
+0

不要忘記obj2必須擁有比obj1更多的成員。 – AHBagheri