当前位置: 首页 > 面试题库 >

jQuery / JavaScript JSON对象比较

东方淇
2023-03-14
问题内容

是否可以比较2组json对象的差异?我所拥有的是一个通过jquery $
post()轮询JSON对象的脚本。我想要做的是拿走刚刚被轮询的对象,并将其与存储的对象进行比较。如果一个与另一个之间有任何更改,请将其应用于存储对象或替换(以任何一种方式替换),但是从UI角度来看,我正在通过查找两者之间的差异,将更改无缝地应用于JSON对象。
2.之所以要这样做,是因为现在我已经拥有了UI,因此无论更改是否更改,UI都将完全按每次轮询重新加载,从UX的角度来看,它基本上看起来像 __

我想知道是否可以找到这两个对象之间的差异,然后我将触发一个功能,该功能将针对该差异进行编辑。


问题答案:

我想要做的是拿走刚刚被轮询的对象,并将其与存储的对象进行比较。如果一个与另一个之间有任何更改, 请将其 应用于存储的对象
或替换它(任一种方式)

如果您对真正简单的“是否以任何方式更改了?是/否”解决方案感到满意,那么如果更改了,只需将新的替换为先前的对象(根据我引用的问题的一部分) ,那么您可以
解析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()网上浮动的众多比较功能之一在哪里?

(注意:我并没有为.hasOwnProperty()上面的问题而烦恼,因为我假设以JSON形式返回到Ajax请求的对象将不会从原型链继承属性。类似地,isEqual()用于此目的的函数也不必担心属性是函数,则只需担心JSON字符串中的有效内容。)



 类似资料:
  • 问题内容: 我想比较两个JavaScript对象数组,以查看它们是否相同。每个数组中的对象可能不会(并且很可能不会)以相同的顺序排列。每个数组最多只能有10个对象。我以为jQuery可以解决这个问题,但是我在网上找不到很多。 我知道可以使用简单的嵌套解决方案,但是有我不知道的内置函数吗? 谢谢。 问题答案: 有一个简单的方法… 如果以上返回true,则即使元素的顺序不同,两个数组也相同。 注意:仅

  • 我已经被覆盖了hashcode和equals以查找具有相同开始日期和关闭日期的值。我得到了重复对象的类似哈希代码。当等同于这些对象时,我得到了布尔值“假”。在我的理解中,对象==对象比较对象的引用,即使引用是相同的;代码返回假。你能帮我理解是什么问题吗?我在下面发布了我的代码: Main.java 输出: 检查客户对象引用:Customer@643 对象引用(位于Map中):[Customer@6

  • 我正在尝试创建一个二进制搜索程序,该程序可以使用各种类型的变量(int、float、string等)来查看数组中是否存在元素。我正试图找出如何比较变量。下面是我正在使用的内容的草图: 我甚至不确定使用对象是否是最好的方法。

  • 问题内容: 我必须将对象与预定义类的列表进行比较。 使用安全还是应该使用? 注意: 我不能使用,我没有对象,我只有对象。在这种情况下,我会像枚举一样使用它! 问题答案: 不会覆盖来自的方法,该方法是这样实现的: 因此与(除非为null)相同。

  • 问题内容: 我刚刚开始为AngularJS应用编写测试,并且正在Jasmine中进行测试。 以下是相关的代码段 ClientController: ClientControllerSpec: 测试失败: 有谁知道为什么会发生这种情况吗? 另外..由于我不熟悉AngularJS测试,因此欢迎对我的测试设置错误还是可以改进提出任何意见。 更新: 包括ClientService: 另外,我通过比较id解

  • 在爪哇中。如果我们必须将一个对象与另一个对象进行比较。我们比较该对象中的每个字段。 学生 1 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。学生 2 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。因此,要检查2名学生是否相等...我们比较每个字段。 但是,如果 Student 对象有许多字段,该怎么办?学生1对象有标记1,标记2,标记3,名称,年龄,地址,颜色,类,国家,部