Compare 2 JSON objects
Possible Duplicate:
Object comparison in JavaScript
是否有任何方法接受2个JSON对象并比较2以查看是否有任何数据发生了更改?
编辑
审查意见后,需要澄清。
JSON对象定义为
"an unordered set of name/value pairs.
An object begins with { (left brace)
and ends with } (right brace). Each
name is followed by : (colon) and the
name/value pairs are separated by ,
(comma)." -- json.org
我的目标是能够比较2个JSON对象文本,简单地说。
我不是javascript专家,所以如果在javascript中,这些是对象文本,那么我想这就是我应该称之为它们的地方。
我相信我正在寻找的方法能够:
深度递归以查找唯一的名称/值对
确定两个对象文本的长度,并比较名称/值对,以查看两者是否存在差异。
- 没有什么比JSON对象更像了。JSON字符串或Javascript对象,但不是这两者的组合(好的,可能存在Javascript字符串;)。
- @MJW06D是要与恰好是对象JSON的字符串进行比较,还是要比较两个现有的javascript Object实例?
- "Felix Kling,你说得对,但会话中的一个"JSON对象"对我来说意味着Java中什么叫做POJO……一个只包含(一个层次结构)原语的普通对象,而不是具有构造函数、私有或公共函数等的对象…技术上不正确,但有助于理解问题。
- @谢谢你的意见。但是,术语"JSON对象"是不正确的。如果我们能让@mjw06d澄清他的意图,这个问题要么是现有问题的直接副本,要么应该重新命名为"比较2个JSON对象字符串"。
- @felix kling,*phrogz:在JSON术语中,对象是由大括号分隔的实体。所以,是的,有一个JSON对象。(RFC ietf.org/rfc/rfc4627.txt第2.2节?号码=4627)
- @Jeremyp:好的,那么让我们假设在JSON中有JSON对象、JSON数组等,但是在JavaScript中,只有包含JSON的字符串。问题是,当同时谈论JSON和JavaScript时,在这种情况下,人们无法确定对方是否真的知道自己在说什么,或者是否存在误解。这也很有趣:benalman.com/news/2010/03/theres-no-such-thing-as-a-json
- @费利克斯,这篇文章值得一看。我想我已经澄清了我的请求,所以希望它对社区更有帮助。
- @MJW06D:问题是您是否有var x = '{"a": 1}';(带有对象的json字符串)或var x = {a: 1}(javascript对象文本)。从你的编辑中假设后者。
- @Felix,是的,它是一个对象文本,尽管通过序列化/反序列化可以很容易地克服这种技术性。我主要对如何比较它们感兴趣。
- @MJW06D:它不能总是序列化。例如,如果对象包含作为属性的函数,则不包含。但是,如果您谈论的是对象文本,那么您的问题已经得到了回答。
- 您可以使用github.com/mirek/node-rus-diff检查差异,如果a和b相同,rusDiff(a, b)返回false。
- 如果您想查看从JSON Doc A到Doc B的更改,请查看RFC 6902中的JSON补丁及其实现。例如Java一个GITHUBUCOM/FLIPCAT-T-CuBATOR/ZJSONFAPH
仅仅解析JSON并比较两个对象是不够的,因为它不是完全相同的对象引用(但可能是相同的值)。
你需要做一个深刻的平等。
来自http://threebit.net/mail-archive/rails-spinoff/msg06156.html-这似乎是使用jquery。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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中。
- 不适合我…
- 我已经尝试了你所有可能的功能变化,但似乎没有效果。尤其是k1.zip。