在 ramda 中组合函数

combine functions in ramda

我有一个接受两个参数的函数,我想柯里化它,因为它在代码中使用了不止一次。这是函数:

const discount = R.sum(R.map(R.propOr('0', 'discount'), invoiceArr));

现在我想给参数 ('discount' & invoiceArr) 和 return 赋值。 我尝试了另一种方式,如下所示:

const sumByPropName = R.curryN(2, R.compose(R.sum, R.pluck));

但是这种方式没有propOr方法。

您可以通过多种方式来解决这个问题。假设您仍然想要柯里化函数,最简单的方法是添加参数

const sumByPropName = R.curry((prop, items) => R.compose(R.sum, R.map(R.propOr(0, prop)))(items))

另一种方法是使用 R.defaultTo 映射未定义的值并将它们全部设置为 0,然后再传递给 sum

const sumByPropName = R.curryN(2, R.compose(R.sum, R.map(R.defaultTo(0)), R.pluck))

最后,您可以自己创建一个 pluckOr 函数,使 sumByPropName 更简洁一些(尽管肯定有更好的写法 pluckOr

const pluckOr = R.curry((defaultVal, propName, items) => R.map(R.propOr(defaultVal, propName), items))
const sumByPropName = R.curryN(2, R.compose(R.sum, pluckOr(0)))