如何用Ramda的prop等函数无参数化实现球队数组的筛选与映射
用Ramda实现无显式参数的球队筛选与转换
嘿,我懂你想让代码更贴合Ramda的函数式风格,去掉那些显式的team参数的诉求~ 你之前遇到的报错,是因为对Ramda函数的调用方式理解有点偏差,咱们来一步步修正:
为什么你的写法会报错?
你尝试的filter(prop('categories').includes('Prem League'))有个问题:prop('categories')返回的是一个函数(这个函数会接收一个对象,返回它的categories属性值),而不是直接拿到数组。函数本身没有includes方法,所以自然会抛出“prop(...).includes is not a function”的错误。
Ramda提供了自己的柯里化版本includes函数,功能和原生数组的includes一致,但更适合函数组合场景,我们需要把它和prop组合起来使用。
改造后的完整代码
这里是符合你需求的Ramda风格实现,完全去掉了显式的team参数:
import { pipe, map, filter, prop, includes, applySpec } from 'ramda' const teams = [ {name: "Liverpool", id: "1", categories: ['Prem League']}, {name: "Man Utd", id: "2", categories: ['Blue Square']}, {name: "Sheff Utd", id: "2", categories: ['Prem League']}, ] const getTeamOptions = pipe( // 筛选出categories包含'Prem League'的球队 filter(pipe(prop('categories'), includes('Prem League'))), // 转换为{label: name, value: id}的结构 map(applySpec({ label: prop('name'), value: prop('id') })) ); getTeamOptions(teams)
关键部分解释
筛选逻辑的改造:
pipe(prop('categories'), includes('Prem League'))是一个组合函数:- 首先
prop('categories')接收球队对象,提取出它的categories数组; - 然后把这个数组传给
includes('Prem League'),判断是否包含目标字符串;
- 首先
- 整个组合函数会返回一个布尔值,刚好符合
filter需要的断言函数。
转换逻辑的改造:
applySpec({ label: prop('name'), value: prop('id') })是Ramda专门用来生成对象转换函数的工具:- 它接收一个对象模板,每个属性对应一个取值函数;
- 当传入球队对象时,会自动用
prop('name')提取名称作为label,用prop('id')提取ID作为value,完全不需要显式声明team参数。
这样写既符合课程推荐的Ramda最佳实践,又保持了代码的简洁和可读性,完美实现你的需求~
内容的提问来源于stack exchange,提问作者peter flanagan
相关产品推荐
相关产品推荐

