标题几乎说了。我有两个JSON对象,我想知道它们是否相等(具有相同的属性值)。
我可以对它们进行字符串化,但我不确定两个相等的对象是否总能产生相同的输出:
E.g:
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"favoriteColors": ["blue", "green", "red"]
}
是一个不同的字符串:
{
"age": 25,
"lastName": "Smith",
"firstName": "John",
"favoriteColors": ["blue", "green", "red"]
}
但作为对象,它们具有相同的属性。
答案 0 :(得分:8)
Flex SDK中有一种方法。它在班级ObjectUtil
中。以下是来源的描述:
/**
* Compares the Objects and returns an integer value
* indicating if the first item is less than greater than or equal to
* the second item.
* This method will recursively compare properties on nested objects and
* will return as soon as a non-zero result is found.
* By default this method will recurse to the deepest level of any property.
* To change the depth for comparison specify a non-negative value for
* the depth parameter.
* @param a Object.
* @param b Object.
* @param depth Indicates how many levels should be
* recursed when performing the comparison.
* Set this value to 0 for a shallow comparison of only the primitive
* representation of each property.
* For example:
* var a:Object = {name:"Bob", info:[1,2,3]};
* var b:Object = {name:"Alice", info:[5,6,7]};
* var c:int = ObjectUtil.compare(a, b, 0);In the above example the complex properties of a and
* b will be flattened by a call to toString()
* when doing the comparison.
* In this case the info property will be turned into a string
* when performing the comparison.
* @return Return 0 if a and b are null, NaN, or equal.
* Return 1 if a is null or greater than b.
* Return -1 if b is null or greater than a.
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public static function compare (a:Object, b:Object, depth:int=-1) : int;
如果您不想要整个SDK,可能只需获取此功能/类并使用该源。
您可以看到来源here。大多数工作都是在函数internalCompare
中完成的。
答案 1 :(得分:1)
也许您可以将两个对象转换为字符串然后比较它们
function compareJSON(a:Object, b:Object):Boolean
{
return JSON.stringify(a)===JSON.stringify(b);
}
答案 2 :(得分:0)
编辑:Barış的答案是最好的选择,因为它经过了尝试和测试。以防这对某人派上用场:
鉴于JSON值仅限于一小组简单类型,因此应该可以非常轻松地通过属性进行递归。这些行中的某些内容适用于您的示例:
private function areEqual(a:Object, b:Object):Boolean {
if (a === null || a is Number || a is Boolean || a is String) {
// Compare primitive values.
return a === b;
} else {
var p:*;
for (p in a) {
// Check if a and b have different values for p.
if (!areEqual(a[p], b[p])) {
return false;
}
}
for (p in b) {
// Check if b has a value which a does not.
if (!a[p]) {
return false;
}
}
return true;
}
return false;
}