我想如果我能找到两个对象之间的差异,我会触发一个函数,我将编辑特定于差异的UI.
解决方法
What I want to do is take the object that was just polled and compare it to a stored one. Where if there is any changes from one to the other apply them to the stored object or replace it (either way)
如果您对一个非常简单的“它有任何变化吗?是/否”解决方案感到满意,如果它已经改变了,您只需用新的对象替换上一个对象(根据我引用的问题部分),然后您可以在解析之前保存JSON响应,即将其保存为Web服务器发送它的字符串格式.然后,当下一个响应进来时,将新字符串与旧字符串进行比较.如果它们不同(或者如果它是第一个请求),则解析JSON并根据需要对其进行处理以进行显示.当然,这假设您的服务器端代码以一致的格式创建JSON字符串(而不是,例如,更改属性的顺序).
如果我们假设你已经得到(解析)对象,那么isEqual(a,b)函数真的应该处理嵌套对象,属性是数组等.这可以递归地完成,只返回true或false,但是getDifferences(a,b)函数在报告嵌套对象中的差异时会变得混乱.考虑这个简单的例子:
old: {"mum" : "Maria","dad" : "Pierre","kids" : ["Joe","Mike","Louisa"] } new: {"mum" : "Julie","Mary"] }
差异是{“妈妈”:“朱莉”,“孩子们”:[“玛丽”]}? “妈妈”已经改变,“孩子”的名单已经改变,但是“迈克”改为“玛丽”,或者“迈克”和“路易莎”都和“玛丽”一起消失了,或者…… ?也许它应该是“孩子们”:[“乔”,“玛丽”],因为那是新的价值.你如何表明删除?这只是我头脑中的第一个例子,我不知道你将如何处理差异.它可能很快变得更糟:如果“kids”数组包含对象而不是字符串来表示整个家族树怎么办?如果新的“妈妈”财产是[“玛丽亚”,“朱莉”](允许继父母等)怎么办?
如果对于您的特定数据,您知道您只有一维对象,那么您可以执行以下简单操作:
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字符串中的有效内容.)