如何在javascript中断言部分深度相等/比较对象?

时间:2015-08-01 21:56:25

标签: javascript

我有一个API,我想声明至少返回了预期的数据。我不在乎是否会返回更多数据。

因此,我想比较两个对象(expectedactual),其中expected的所有属性必须等于actual,但actual可能包含var expected = { foo: 1, bar: { x1: 42, a1: [ 1, 2, { x: 7 } ] } } var actual = { foo: 1, whatever: 55, // to be ignored additional: { // to be ignored ignore: 1 }, bar: { x1: 42, a1: [ 1, 2, { x: 7, y: 8 // to be ignored } ] } } partiallyEqual(expected, actual) // returns true 更多属性:

partiallyEqual({x: 1}, {a:2, x:1}) // return true
partiallyEqual({x: 1}, {a:2, x:2}) // return false (x is different)

更多例子:

actual

如果partiallyEqual([1, 3], [1, 2, 3]) // return true partiallyEqual([3, 1], [1, 2, 3]) // return false (different order) 包含其他元素,则数组可以(可选)受到部分等效。

NULL

2 个答案:

答案 0 :(得分:0)

我使用这个递归函数,这是我前一段时间写的:

Object.prototype.equals = function(to) {
    for (var prop in to) {
        if (this.hasOwnProperty(prop) && to.hasOwnProperty(prop)) {
            if (to[prop] && typeof this[prop] == "object" && typeof to[prop] == "object") {
                if (!this[prop].equals(to[prop])) {
                    return false
                }
            } else if (this[prop] != to[prop]) {
                return false
            }
        }
    }
    return true;
};

({ x: { a: 1, b: 2 } }).equals({ x: { a: 1, b: 2 } }) => true
({ x: { a: 1, b: 2 } }).equals({ x: { a: 1, b: 1 } }) => false
({ x: [1,2] }).equals({ x: { 1:1,2:2 } }) => true (doesn't differentiate between array and/or object)

一旦发现旧对象与新对象有所不同,此函数将返回false。如果新对象具有旧对象的所有属性,则它可以包含任何内容。

答案 1 :(得分:0)

对于不同的情况,深度相等可能会很棘手,例如NaN !== NaN并且可能存在循环引用。我最近用递归和循环引用检查编写了一个简单的深度相等检查函数函数,它应该非常直接地遵循。您可以简单地忽略一些长度检查以使部分完全相同。

github上的源代码:https://github.com/ryancat/simple-deep-equal