假设我有以下两个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的值。这就是“字段E”和它的值不被返回的原因。
如果可能,想出一个函数返回一个包含已更改的值的json对象,最好的方法是什么?
我已经尝试了:我已经尝试通过手动指定我试图检查的字段进行比较,但我希望有一些东西,要求我不硬编码“字段”,因为这是非常低效的,每次我添加一个新的字段到JSON B,我必须在我正在寻找的字段中硬编码...这就是为什么我在寻找一种不那么痛苦的东西。
发布于 2012-04-28 05:10:23
创建这样的函数并不太难。只需遍历第二个对象中的每个字段,如果第一个对象中没有该字段,或者值与第一个不同,则将该字段放入返回对象中。
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上看到它的实际效果。
发布于 2012-04-28 05:12:02
您可以查看json diff包装器here。
它还演示了page.You可以使用这个包装器。
发布于 2012-11-15 08:46:08
这个函数对于非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;
}; https://stackoverflow.com/questions/10357830
复制相似问题