如何使用_.over,超过两个变量?

时间:2017-08-01 07:42:51

标签: javascript functional-programming lodash

这是我想要开始工作的主旨。在这一点上,感觉就像不使用_.over函数会更容易

(value, key) => _.overSome(thingOnValueA, thingOnValueB, thingOnKeyA)

_.oversome创建一个检查所有谓词的函数,在我的实例中我有大约5个谓词。问题是它将数组中的两个变量传递给所有内部函数/谓词,前两个应该是值,最后一个是键。我试过这个,但它不起作用:

(value, key) => _.overSome(thingOnValueA(value), thingOnValueB(value), thingOnKeyA(key))

(overSome需要功能,而不是功能调用)

还有:

(value, key) => _.overSome(value => thingOnValueA(value), value => thingOnValueB(value), key =>thingOnKeyA(key))

(eslint警告该值已在较高范围内使用)

user3297291建议:

(value, key) => _.overSome(() => thingOnValueA(value), () => thingOnValueB(value), () =>thingOnKeyA(key))

转化为

var myFunction = function myFunction(value, key) {
    return _.overSome(function() {
        return thingOnValueA(value)
    }, function() {
        return thingOnValueb(value)
    }, function() {
        return thingOnKeyA(key)
    }, 
}

我认为由于lodash的工作原理,当它运行每个函数时,它会查看传递给它的参数,并获得0,这会破坏它的工作原理。

我的情况,对于上下文,我正在检查一个数组或键值对,看看它们是否是有效的搜索词

[
    {shoeSize: 5},
    {colour: "white"}
    {width: ""}
    {searchId: "8dc0ce98-5b72-4993-bbe3-6edc1ec2a5b8"}
 ]

所以我排除了无效的颜色,空的字符串和太大的鞋码以及我实际上并不感兴趣的字段(这只是一个虚拟的例子,我不卖鞋子!)。

如何拆分两个变量之间的_.overSome函数?

编辑:

以下是我正在做的具体示例:

const hasInternalField = _.partial(_.includes, ['searchId']);
const isInvalidSearchTerm = _.overSome(_.isundefined, _.isEmpty, _.negate(_.isString), hasInternalField)

现在我从hasInternalField中取出_.overSome并检查何时调用isInvalidSearchTerm。我仍然对实际解决方案感兴趣。

1 个答案:

答案 0 :(得分:0)

_.overSome将一组谓词函数作为输入并返回单个函数,例如:

const g = _.overSome(f1, f2, f3);

将使用传递给f1的任何参数调用内部函数f2f3g。通常g传递一个参数,但它也可以采用一个或零参数。

例如,如果你想

// Zero argument version
const predicate = (value, key) => _.overSome(
     () => thingOnValueA(value),
     () => thingOnValueB(value),
     () => thingOnKeyA(key)
)(); // Don't forget to actually call the function returned by `_.overSome`

(您也可以部分应用过滤功能,例如将() => thingOnValueA(value)替换为thingOnValueA.bind(null, value)_.partial(thingOnValueA, value),但我个人认为箭头功能版本更清晰了)

或者,您可以将valuekey直接传递给_.overSome返回的函数,并消除额外的函数包装器:

// Two argument version
const predicate = _.overSome(
    (value, key) => thingOnValueA(value),
    (value, key) => thingOnValueB(value),
    (value, key) => thingOnKeyA(key),
);