在函数中间注入值

Injecting value in middle of function

如果我想定义一个函数来过滤匹配给定值的集合,我可以这样写:

const { filter, equals} = R

const data = [1, 2, 3, 4, 5]

const filterDataFor = x => filter(equals(x), data);

console.log(filterDataFor(2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

我想我也可以这样写:

const { filter, equals, __ } = R

const data = [1, 2, 3, 4, 5]

const filterDataFor = filter(equals(__), data)

console.log(filterDataFor(2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

但显然不是;在第二个例子中,filterDataFor 不是函数。有人可以指出我哪里出错了吗?

你可以做的是在 filter 中放置一个简单的占位符而不是 equals(__),然后简单地将它们 compose 与等号放在一起:

const { filter, equals, __, compose } = R
const data = [1, 2, 3, 4, 5]
const filterDataFor = compose(filter(__, data), equals);

console.log(filterDataFor(2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

由于 compose 从右到左组合函数,当您调用 filterDataFor(2) 时,它将首先计算 equals(2) 然后将应用结果函数而不是占位符,本质上是结果在 filter(equals(2), data).

您是否考虑过使用 without

Returns a new list without values in the first argument. R.equals is used to determine equality.

without([2], [1, 2, 3, 4, 5]);
//=> [1, 3, 4, 5]

它也适用于多个值:

without([2, 5], [1, 2, 3, 4, 5]);
//=> [1, 3, 4]

Andras Simon 的答案的一个变体是翻转过滤器函数,这样谓词就是第二个参数。

const { filter, equals, flip, compose } = R
const data = [1, 2, 3, 4, 5]
const filterDataFor = compose(flip(filter)(data), equals);

console.log(filterDataFor(2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>