Ramda - 找到类似函数但返回谓词的非虚假结果而不是找到的值

时间:2016-12-02 10:55:40

标签: javascript functional-programming ramda.js

ramda中有没有像find那样的函数,但是找到的元素不是返回谓词函数的结果吗?

因此,例如R.find(x => x === 2 ? 'two' : false, [1, 2, 3])将返回'two'而不是2

2 个答案:

答案 0 :(得分:3)

一般来说,如果你试图让一个函数做多个事情,或者让它在不同的输入下表现得不同,那么可能有更好的方法来实现你的目标。

函数组合允许您采用隔离特定行为的函数并将它们组合以创建新的有意义的行为

// simple function "foo"
const foo = x => x === 2 ? 'two' : false

// combine foo behaviour with simple function "find"
// creates a new simple function, "bar"
const bar = R.compose(foo, R.find(R.equals(2)))

bar([1,2,3]) // => 'two'
bar([1,3])   // => false

答案 1 :(得分:0)

这可以通过跟踪谓词结果并在find执行后返回来实现。对于这个解决方案,让我们在JS中利用它,赋值是一个表达式。此外,我们将在lambda中包含赋值,以使谓词函数“可注入”。

const customFind = (predicate, list) => {
    var predicateResult
    R.find((a) => predicateResult = predicate(a), list)
    return predicateResult
}

使用示例

console.log(customFind(x => x === 2 ? 'two' : false, [1, 2, 3]))

此外,我建议curry自定义函数使其可组合。

const customFind = R.curry((predicate, list) => {
    var predicateResult
    R.find((a) => predicateResult = predicate(a), list)
    return predicateResult
})

现在可以部分应用

const findTwoOrFalse = customFind(x => x === 2 ? 'two' : false)

findTwoOrFalse([1, 2, 3]) // 'two'