javascript - 如何在 Lodash 的 isEqualWith 中将缺失和未定义的属性视为等效

标签 javascript lodash equality

我正在与 Lodash 的 _.isEqualWith 的自定义比较函数作斗争.我想要一个这样的功能:

const comparisonFunc = /* ...TBC... */

// Should be true:
_.isEqualWith({ a: undefined }, { }, comparisonFunc);

// Should still be false, as normal:
_.isEqualWith({ a: undefined }, { a: 123 }, comparisonFunc);

// Should still be false, as normal:
_.isEqualWith([undefined], [ ], comparisonFunc);

IE。对于比较中的任何对象(递归),属性设置为 undefined应该被视为它们不存在。

最佳答案

这并不像我想的那么简单,但我找到了一个解决方案:

const comparisonFunc = (a, b) => {
    if (_.isArray(a) || _.isArray(b)) return;
    if (!_.isObject(a) || !_.isObject(b)) return;

    if (!_.includes(a, undefined) && !_.includes(b, undefined)) return;

    // Call recursively, after filtering all undefined properties
    return _.isEqualWith(
        _.omitBy(a, (value) => value === undefined),
        _.omitBy(b, (value) => value === undefined),
        comparisonFunc
    );
}


// Should be true:
_.isEqualWith({ a: undefined }, { }, comparisonFunc); // = true

// Should still be false, as normal:
_.isEqualWith({ a: undefined }, { a: 123 }, comparisonFunc); // = false

// Should still be false, as normal:
_.isEqualWith([undefined], [ ], comparisonFunc); // = false

如果有人有更简单或更好的东西,很高兴接受其他答案:-)

关于javascript - 如何在 Lodash 的 isEqualWith 中将缺失和未定义的属性视为等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57874879/

相关文章:

javascript - JS显示的列表

javascript - Facebook javascript FB.ui 请求在 IE11 和 Firefox 上挂起

javascript - 使用 lodash 3 将对象转换为对象数组

javascript - 按顺序显示所有 promise 的结果

ruby - 为什么 "foo".class === String 返回 false?

javascript - 在 jquery 中通过文本选择选项

javascript通过相同的键查找对象并将它们合并

c++ - 类是否具有自反性? (即实例总是等于它们自己吗?)

javascript - "string"=== "string"与 typeof 的优点

javascript - 放大六边形瓷砖javascript