Javascript使用lodash isEqual比较具有函数的对象

pis*_*hio 7 javascript lodash

如果它们具有函数,如何比较两个对象是否相等?lodash的isEqual工作非常好,直到函数被抛出:

_.isEqual({
    a: 1,
    b: 2
}, {
    b: 2,    
    a: 1
});

// -> true

_.isEqual({
    a: 1,
    b: 2,
    c: function () {
        return 1;
    }
}, {
    a: 1,    
    b: 2,
    c: function () {
          return 1;
    }
});

// -> false
Run Code Online (Sandbox Code Playgroud)

Ada*_*uch 5

您确定要比较功能吗?如果您只关心比较不是函数的每个属性,那么使用lodash很容易做到:

var o1 = { a: 1, b: 2, c: function() { return 1; } },
    o2 = { a: 1, b: 2, c: function() { return 1; } };

_.isEqual(o1, o2)
// ? false

_.isEqual(_.omit(o1, _.functions(o1)), _.omit(o2, _.functions(o2)));
// ? true
Run Code Online (Sandbox Code Playgroud)

功能()函数返回功能属性的列表,并使用省略() ,你可以摆脱他们。

  • 请注意,这不适用于深度比较。如果函数是嵌套的,它不会被 `functions` 找到,也不会被省略。 (2认同)

Gau*_*wal 5

这是我尝试的:

_.isEqual(o1, o2, function(val1, val2) {
  if(_.isFunction(val1) && _.isFunction(val2)) {
    return val1.toString() === val2.toString();
  }
})
Run Code Online (Sandbox Code Playgroud)

Lodash支持一个customizer允许您编写自己的相等性检查的功能。这似乎是一个很好的测试,可以查看功能是否逐个字符相同。

  • `_.isEqualWith` 有第三个 `customizer` 参数 https://lodash.com/docs/#isEqualWith (2认同)