是否有可能比较两组json对象之间的差异?我所拥有的是一个脚本,它通过jquery ()轮询JSON对象。我想要做的是把刚刚被轮询的对象与存储的对象进行比较。如果有从一个到另一个的任何更改,将它们应用到存储的对象或替换它(不管是哪种方式),但是从UI的角度来看,我正在无缝地通过查找JSON对象之间的差异,将这些更改应用到JSON对象中。我想这样做,因为现在我已经有了它,所以不管更改与否,UI都是完全重新加载的,从UX的角度看,这基本上是**。
我想,如果我能找到两个对象之间的差异(如果有的话),我将触发一个函数,我将编辑特定于这些差异的UI。
发布于 2011-11-13 02:13:18
我想要做的是将刚刚被轮询的对象与存储的对象进行比较。如果有从一个到另一个的任何更改,将它们应用到存储的对象或替换它(不管是哪种方式)
如果您对一个非常简单的“它以任何方式改变了吗?是/否”的解决方案感到满意,那么如果它已经改变了,您只需用新的对象替换以前的对象(正如我引用的问题的一部分),那么您可以在解析JSON响应之前保存它,也就是说,将它保存为web服务器发送它的字符串格式。然后,当下一个响应出现时,将新字符串与旧字符串进行比较。如果它们不同(或者是第一个请求),解析JSON并酌情处理它以供显示。当然,这假定您的服务器端代码正在以一致的格式创建JSON字符串(而不是,例如,更改属性的顺序)。
如果我们假设您已经有了(已解析的)对象,那么isEqual(a,b)函数实际上应该处理嵌套对象、数组属性等。这可以递归完成,只需返回true或false,但是getDifferences(a,b)函数在报告嵌套对象中的差异时会变得很困惑。考虑一下这个简单的例子:
old: {"mum" : "Maria", "dad" : "Pierre", "kids" : ["Joe", "Mike", "Louisa"] }
new: {"mum" : "Julie", "dad" : "Pierre", "kids" : ["Joe", "Mary"] }差别是{"mum" : "Julie", "kids" : ["Mary"]}吗?“妈妈”已经变了,“孩子”的列表也变了,但是“迈克”改成了“玛丽”,还是“迈克”和“路易莎”都是新来的,还是.?也许应该是"kids": ["Joe","Mary"],因为这是新的价值。你是怎么指出删除的?这只是我头上的第一个例子,我不知道你会怎么处理这些差异。情况可能会很快变得更糟:如果“子”数组包含对象而不是字符串来表示整个家族树,该怎么办?如果新的“妈妈”属性是["Maria", "Julie"] (允许继母等等),该怎么办?
如果对于特定的数据,您知道只有一维对象,那么您可以做一些简单的事情,如下所示:
function getDifferences(oldObj, newObj) {
var diff = {};
for (var k in oldObj) {
if (!(k in newObj))
diff[k] = undefined; // property gone so explicitly set it undefined
else if (oldObj[k] !== newObj[k])
diff[k] = newObj[k]; // property in both but has changed
}
for (k in newObj) {
if (!(k in oldObj))
diff[k] = newObj[k]; // property is new
}
return diff;
}对于上面允许嵌套对象的最简单的更改是,假设一个属性是一个对象/数组,那么您只关心它在任何方面是否不同,而不是深入地报告哪些“子属性”发生了更改。如果是这样的话,只需使用上面的函数并更改:
else if (oldObj[k] !== newObj[k])至
else if (!isEqual(oldObj[k],newObj[k]))其中,isEqual()是在web或on StackOverflow中浮动的许多比较函数之一。
(注意:上面我不介意.hasOwnProperty(),因为我假设作为JSON返回到Ajax请求的对象不会继承原型链中的属性。类似地,用于这个目的的isEqual()函数不需要担心属性是函数,它只需要担心JSON字符串中什么是有效的。
发布于 2015-02-19 10:49:42
很抱歉回答旧线程,但我的回答可能会帮助其他可能面临相同issue.the的人,最简单、最简单的代码是比较两个json对象,如下所示。谢谢
<script type="text/javascript">
$(document).ready(function () {
var a = { "id": "210", "memberlist": "john" };
var b = { "id": "210", "memberlist": "john1" };
alert(JSON.stringify(a) != JSON.stringify(b) ? 'not same' : ' same');
});
</script>发布于 2011-11-13 01:41:56
一个潜在的解决方案可能是使用jQuery的扩展。只要对象具有相同的属性,就可以很好地解决问题。
var newJSON = $.extend({},oldJSON,serverData);如果旧对象不存在于新对象中,并使用来自服务器的新数据的属性覆盖任何现有属性,您就会保留旧对象,并创建一个具有旧对象属性的新对象。
https://stackoverflow.com/questions/8108666
复制相似问题