【发布时间】: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))(value和key现在指的是最初传递的参数,而不是新参数)。 -
@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