【问题标题】:Compare 2 JSON objects [duplicate]比较 2 个 JSON 对象 [重复]
【发布时间】:2011-05-26 19:12:32
【问题描述】:

可能重复:
Object comparison in JavaScript

是否有任何方法可以接收 2 个 JSON 对象并比较这两个对象以查看是否有任何数据发生变化?

编辑

在审查了 cmets 之后,需要进行一些澄清。

  1. 一个 JSON 对象被定义为

    “一组无序的名称/值对。 对象以 { 开头(左大括号) 并以 }(右大括号)结尾。每个 名称后跟:(冒号)和 名称/值对由 , 分隔 (逗号)。”——json.org

  2. 简单地说,我的目标是能够比较 2 个 JSON 对象字面量。

我不是 javascript 专家,所以如果在 javascript 中这些是对象字面量,那么我想我应该这样称呼它们。

我相信我正在寻找的是一种能够:

  1. 深度递归查找唯一的名称/值对
  2. 确定两个对象字面量的长度,并比较名称/值对以查看其中是否存在差异。

【问题讨论】:

  • 没有什么比得上 JSON 对象了。 JSON 字符串或 JavaScript 对象,但不是其中任何一个的组合(好吧,也许 JavaScript 字符串存在;))。
  • @mjw06d 您是要比较对象的 JSON 字符串,还是要比较两个现有的 JavaScript Object 实例?
  • @Felix Kling,你说得对,但对我来说,“JSON 对象”意味着在 Java 中称为 POJO ......到具有构造函数、私有或公共函数等的对象...在技术上不正确,但它有助于理解问题。
  • @box9 感谢您的意见。但是,术语“JSON 对象”是不正确的。如果我们可以让@mjw06d 澄清他的意图,那么这个问题要么是现有问题的直接重复,要么应该重新命名为“比较 2 个 JSON 对象字符串”。
  • @Felix Kling,*Phrogz:在 JSON 术语中,对象是一种由大括号分隔的实体。所以,是的,有一个 JSON 对象这样的东西。 (RFC ietf.org/rfc/rfc4627.txt?number=4627 的第 2.2 节)

标签: javascript json compare


【解决方案1】:

仅仅解析 JSON 并比较两个对象是不够的,因为 它不会是完全相同的对象引用(但可能是相同的值)。

你需要做一个深度相等。

来自http://threebit.net/mail-archive/rails-spinoffs/msg06156.html - 这似乎是使用jQuery。

Object.extend(Object, {
   deepEquals: function(o1, o2) {
     var k1 = Object.keys(o1).sort();
     var k2 = Object.keys(o2).sort();
     if (k1.length != k2.length) return false;
     return k1.zip(k2, function(keyPair) {
       if(typeof o1[keyPair[0]] == typeof o2[keyPair[1]] == "object"){
         return deepEquals(o1[keyPair[0]], o2[keyPair[1]])
       } else {
         return o1[keyPair[0]] == o2[keyPair[1]];
       }
     }).all();
   }
});

Usage:

var anObj = JSON.parse(jsonString1);
var anotherObj= JSON.parse(jsonString2);

if (Object.deepEquals(anObj, anotherObj))
   ...

【讨论】:

  • 如果我错了,请纠正我,但我很确定这不是一种深度递归方法。在我看来,它只适用于 1 级。
  • 更新了函数以使用嵌套对象。
  • 我认为下面这行有问题:if (typeof o1[..] == typeof o2[..] == "object") ... 因为第一次比较会返回一个布尔值。
  • 您应该在返回时使用 3 个等号,因为 1 == "1" 为真,但应该为假
  • k1.zip 来自哪个库?它似乎不在 jQuery 中。
猜你喜欢
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 2022-06-26
  • 2013-10-02
相关资源
最近更新 更多