如何用Ramda实现Point-free风格的数组字段提取与映射转换
你现有的实现已经非常简洁易读,逻辑上没有问题。如果要改成纯 Point-free 风格,可以用 Ramda 内置的工具函数替换匿名函数,实现方案如下:
import { compose, uniq, map, converge, defaultTo, prop, propOf } from 'ramda'; const mapper = {email_sha256: 'email', email_sha_256: 'email'}; export const mapToId = compose( uniq, map( converge( defaultTo, [prop('id'), compose(propOf(mapper), prop('id'))] ) ) );
注:如果使用的 Ramda 版本低于 0.26.0 没有内置
propOf方法,可以用flip(prop)(mapper)替换,功能完全等价。
如果更偏好先提取所有 id 再做映射的写法,逻辑会更清晰,等价实现如下:
export const mapToId = compose( uniq, map(converge(defaultTo, [identity, propOf(mapper)])), map(prop('id')) );
需要注意的是,纯 Point-free 的写法可读性会稍弱于你原本的实现,如果没有强制的代码风格要求,原实现已经是综合可读性和性能的最优方案。如果需要把 mapper 作为动态参数传入,也可以封装成柯里化的 Point-free 版本:
export const mapToId = curry((mapper, arr) => compose( uniq, map(converge(defaultTo, [identity, propOf(mapper)])), map(prop('id')) )(arr)); // 调用方式 mapToId(mapper, arr)
内容的提问来源于stack exchange,提问作者Kamya Kashyap
相关产品推荐
相关产品推荐

