2012-04-27 114 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