2012-04-27 113 views
13

說我有以下2個JSON對象:Javascript 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" 
} 

示例函數: 功能(jsonstringA,jsonstringB)

實施例(如果JSON A和JSON乙用作參數):

返回一個新的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作爲比較的基礎ison,所以函數只返回缺少的字段和jsonStringB的值。這就是爲什麼「字段E」及其價值沒有被返回的原因。

如果可能提出一個返回包含已更改值的json對象的函數,那麼最好的方法是什麼?

我試過的是什麼: 我試過通過手動指定我試圖檢查的字段進行比較,但我希望有一些要求我不要硬編碼「字段」,因爲它是非常效率低下,每次我向JSON B添加一個新字段時,我都必須在我正在尋找的字段中進行硬編碼......這就是爲什麼我要尋找一些不那麼痛苦的原因。

+1

http://tlrobinson.net/projects/javascript-fun/jsondiff/ – Phrogz 2012-04-27 21:08:42

+0

您可以根據代碼東西這樣的回答:http://stackoverflow.com/a/1144249/562906 – sinelaw 2012-04-27 21:10:40

回答

11

創建這樣的函數並不難。只需循環遍歷第二個對象中的每個字段,如果它不存在於第一個對象中,或者值與第一個對象不同,則將該字段放入返回對象中。

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; 
}; 

你可以看到它在this demo page的行動。

+0

啊,忽略我的評論,我認爲他也想爲對象a和b的可變數量的屬性進行差異化。但似乎兩個對象具有相同數量的屬性。 – 2012-04-27 21:21:19

+2

OP可能想要遞歸到對象和數組值中。 – Phrogz 2012-04-27 21:22:15

+0

@Progrog我不確定,從他的描述和例子看來,這似乎只是一個淺薄的比較就足夠了。 – 2012-04-27 21:23:34

3

你可以看看JSON DIFF包裝here

它還演示page.You可以使用這種包裝。

2

的功能,正是我一直在後也是不實用 - JSON對象比較

http://jsfiddle.net/muJEu/11/

也擴展它的深嵌套對象。

isEmpty 

可以用很多方式完成。看到Is object empty?

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; 
}; 
+0

如果某個值是一個數組,則該值失敗,因爲'typeof [] ==='object'' – SimplGy 2014-03-01 00:34:16

+1

如果屬性存在於「obj1」中,但不在「obj2」中,則不會按預期執行。例如:'a = {a:true}''b = {b:true}'。 'compareObj(a,b)//返回{b:true}。你可能期望{a:true,b:true}' – SimplGy 2014-03-01 00:35:59

+0

定義了'rett',還是全局變量? – Jocie 2016-04-01 08:37:59