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

时间:2015-05-13 10:35:51

标签: 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

3 个答案:

答案 0 :(得分: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

functions()函数返回一个函数属性列表,使用omit(),你可以删除它们。

答案 1 :(得分:1)

正如lodash文档所述:

  

不支持函数和DOM节点。

https://lodash.com/docs#isEqual

答案 2 :(得分:0)

试试isEqualWith

import { isEqualWith, isFunction } from 'lodash-es'

const o1 = { fn() {} }

const o2 = { fn() {} }

const equal = isEqualWith(o1, o2, (v1, v2) =>
  // if `customizer` returns `undefined`, comparisons are handled by the method instead
  isFunction(v1) && isFunction(v2) ? `${v1}` === `${v2}` : undefined,
)

console.log({ equal }) // { equal: true }