【问题标题】:Checking js deep equality without regard to prototypes (preferably in lodash)在不考虑原型的情况下检查 js 深度相等(最好在 lodash 中)
【发布时间】:2016-12-04 15:16:48
【问题描述】:

我正在使用 lodash isEqual 函数来深入比较 JavaScript 对象。它要求对象具有相同的原型才能被视为相等,如下面的节点 REPL 会话所示:

> const isEqual = require('lodash').isEqual
undefined
> isEqual({a:3},{a:3})
true
> class Foo { constructor(x) {this.a = x} }
[Function: Foo]
> isEqual(new Foo(3), new Foo(3))
true
> isEqual({a:3}, new Foo(3))
false

有没有一种简单的方法可以在不考虑原型的情况下进行深度比较?它仍然应该对日期进行特殊比较;我只想在 lodash 进行递归比较的情况下,它不在乎原型是否不同。显然我可以自己编写代码,但我使用 lodash 不必做那种事情。我也想过做

isEqual(JSON.parse(JSON.stringify(obj1)), JSON.parse(JSON.stringify(obj2)))

也许没关系,但看起来很恶心。

【问题讨论】:

  • 你可以在上一个例子中使用JSON.stringify({a: 3}) === JSON.stringify(new Foo(3))
  • 那行不通。大多数浏览器会给JSON.stringify({a:1, b:2})JSON.stringify({b:2, a:1}) 提供不同的结果。

标签: javascript underscore.js lodash


【解决方案1】:

这不是“简单的方法”,但它可以提供帮助:

function eq(a, b){
    if(!_.isObject(a) || !_.isObject(b)) return 'Error! Only for objects.';
    var keysA = Object.keys(a).sort();
    var keysB = Object.keys(b).sort();
    if(!_.isEqual(keysA, keysB)) return false;
    for(var i = 0, l = keysA.length; i < l; i++){
        if(
            ( _.isObject(a[keysA[i]]) &&  _.isObject(b[keysB[i]]) && !eq(a[keysA[i]], b[keysB[i]])) ||
            (!_.isObject(a[keysA[i]]) && !_.isObject(b[keysB[i]]) && a[keysA[i]] !== b[keysB[i]]) ||
            ( _.isObject(a[keysA[i]]) !== _.isObject(b[keysB[i]]))
        ) return false;
    }
    return true;
}

eq({a: 1}, new Foo(1));         //true
eq({a: 1}, new Foo(2));         //false
eq({a: 1, b: 2}, {b: 2, a: 1}); //true
eq({a: 1, b: 3}, {b: 2, a: 1}); //false

eq({a: {a: 1}}, {a: new Foo(1)})//true

【讨论】:

  • 谢谢。在我看来,这个解决方案会在 Dates 上失效,也许在其他情况下我没有考虑过(或者可能没有考虑过)。我想如果我打算像这样定义一个更复杂的函数,我会从 lodash 实现开始并修改它,或者可能基于 lodash 的 isEqualWith 函数做一些事情。此外,我还看到了一些排序键的“规范 JSON.stringify”函数。不过,就目前而言,我提到的“粗略”解决方案似乎工作正常,所以我坚持使用它,直到它给我带来问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
相关资源
最近更新 更多