如何简化Ramda中给函数数组应用值的实现代码?
简化Ramda中「单值多函数应用」的写法
嘿,你的需求刚好对应Ramda里一个超实用的工具函数——R.juxt,它就是专门用来把同一个参数传给一组函数、然后收集结果数组的,完全不需要flip和compose的组合,写法简洁太多了!
方案一:用R.juxt(最推荐)
R.juxt接受一个函数数组,返回一个新函数:当你调用这个新函数时,它会把传入的参数分别传给数组里的每个函数,最后把所有结果打包成数组返回,完美匹配你的需求!
代码示例:
const f1 = v => v + '1'; const f2 = v => v + '2'; const f3 = v => v + '3'; const result = R.juxt([f1, f2, f3]); result('a') // ["a1", "a2", "a3"]
方案二:手动映射(直观的函数式写法)
如果你不想用juxt,也可以直接用R.map结合函数调用,写法同样清晰,完全绕开flip:
const f1 = v => v + '1'; const f2 = v => v + '2'; const f3 = v => v + '3'; const result = v => R.map(fn => fn(v), [f1, f2, f3]); result('a') // ["a1", "a2", "a3"]
要是想做成柯里化的形式(和原代码调用风格一致),可以改成这样:
const result = R.curry((fns, v) => R.map(fn => fn(v), fns)); // 调用方式:先传函数数组,再传值 result([f1, f2, f3])('a') // ["a1", "a2", "a3"]
为什么原写法显得复杂?
原代码里的compose(flip(map)([f1,f2,f3]), applyTo)其实是把逻辑绕了个弯:先用applyTo把值转换成「接受函数并调用」的函数,再用flip(map)把函数数组映射成每个函数去调用这个值。而juxt直接把这个常用逻辑封装好了,完全不需要额外的反转操作。
内容的提问来源于stack exchange,提问作者Undistraction
相关产品推荐
相关产品推荐

