Ramda如何对同一数据结构使用多个函数完成指定JSON转换
问题原因
你的实现存在两个核心问题导致无法正常组合:
getChapters依赖外部可变变量chapters,属于非纯函数,执行逻辑受外部变量状态影响,不符合函数式编程的组合要求- 你使用的
R.pipe是数据流单向传递:前一个函数的返回值会作为后一个函数的入参。getChapters执行后返回的是排序后的tableItems数组,传入getNodes时已经丢失了原数据根节点的nodes字段,自然无法获取全量节点数据
解决思路
我们可以用Ramda自带的R.converge来实现同时读取原数据的多个字段,全程用纯函数实现,不需要外部可变变量:
- 先把全量nodes按
tableItemId分组,方便后续直接匹配对应章节的节点 - 提取
tableItems按pageNumber排序,过滤出起始点项生成章节结构,同时关联对应nodes
完整实现代码
// 把全量nodes按所属tableItem的id分组 const groupNodesByTableItem = R.pipe( R.path(['nodes']), R.groupBy(R.prop('tableItemId')) ) // 生成章节列表 const generateChapters = R.curry((groupedNodes, sortedTableItems) => R.pipe( R.filter(R.prop('startingPoint')), R.addIndex(R.map)((item, idx) => ({ id: `chapter-${idx + 1}`, name: item.name, nodes: R.propOr([], item.id, groupedNodes) })) )(sortedTableItems) ) // 组合逻辑 const getResult = R.converge( generateChapters, [ groupNodesByTableItem, R.pipe(R.path(['tableItems']), R.sortBy(R.prop('pageNumber'))) ] ) // 调用获取结果 const newJSON = getResult(data)
内容的提问来源于stack exchange,提问作者omygoodness
相关产品推荐
相关产品推荐

