在 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)))
我有一个接受两个参数的函数,我想柯里化它,因为它在代码中使用了不止一次。这是函数:
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)))