【问题标题】:How to use _.over, over two variables?如何使用_.over,超过两个变量?
【发布时间】:2018-01-07 23:09:22
【问题描述】:

这是我要开始工作的要点。在这一点上,感觉不使用 _.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)

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

【问题讨论】:

  • 不确定它是否漂亮,但我认为这应该可行:(value, key) => _.overSome(() => thingOnValueA(value), () => thingOnValueB(value), () =>thingOnKeyA(key))valuekey 现在指的是最初传递的参数,而不是新参数)。
  • @user3297291 我认为是因为 lodash 期望 overSome 接收参数,因此传递给它一个像 () =>thingOnValueA(value) 这样的函数会破坏它。我将添加转译的代码以及查看 lodash 源代码时看到的内容。
  • 你能给出具体的谓词例子以及_.overSome返回的函数是如何使用的吗?
  • 如果您的谓词不接受多个参数,您始终可以将值绑定到您的谓词:(value, key) => _.overSome(thingOnValueA.bind(null, value), thingOnValueB.bind(null, value), thingOnKeyA.bind(null, key))
  • 我删除了代码的转译版本,我认为它与问题无关。

标签: javascript functional-programming lodash


【解决方案1】:

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

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

内部函数f1f2f3 将使用传递给g 的任何参数进行调用。 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),
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多