说我有以下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的值。这就是为什么“Field E”及其价值不会被退回的原因。
如果可能的话,最好的方法是找到一个返回包含已更改值的json对象的函数?
我做了什么: 我已经尝试通过手动指定我要检查的字段来进行比较,但是我希望有一些东西要求我不要对“字段”进行硬编码,因为它非常低效并且每次我向JSON添加一个新字段B,我必须在我正在寻找的领域进行硬编码......这就是为什么我在寻找一种不那么痛苦的东西。
答案 0 :(得分:13)
创建这样的功能并不难。只需循环遍历第二个对象中的每个字段,如果它不在第一个对象中,或者该值与第一个不同,则将该字段放在返回对象中。
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上看到它。
答案 1 :(得分:3)
您可以查看json diff wrapper here
它还有演示页面。你可以使用这个包装器。
答案 2 :(得分:2)
该函数,正如我所追求的那样对非JSON对象比较也很有用
还为深层嵌套对象扩展了它。
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;
};
答案 3 :(得分:0)
在彼得·奥尔森(Peter Olson)的答案中,它不会检查array
的值,为了解决该问题,我修改了这样的解决方案。
var compareJSON = function(obj1, obj2) {
var ret = {};
for(var i in obj2) {
if(!obj1.hasOwnProperty(i) || obj2[i] !== obj1[i]) {
if(!Array.isArray(obj2[i]) || !(JSON.stringify(obj2[i]) == JSON.stringify(obj1[i]))){
ret[i] = obj2[i];
}
}
}
return ret;
};
答案 4 :(得分:0)
如果obj2的属性等于obj1的属性,则此解决方案不起作用,但是obj1具有更多的属性。