You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ramda如何对同一数据结构使用多个函数完成指定JSON转换

问题原因

你的实现存在两个核心问题导致无法正常组合:

  1. getChapters依赖外部可变变量chapters,属于非纯函数,执行逻辑受外部变量状态影响,不符合函数式编程的组合要求
  2. 你使用的R.pipe是数据流单向传递:前一个函数的返回值会作为后一个函数的入参。getChapters执行后返回的是排序后的tableItems数组,传入getNodes时已经丢失了原数据根节点的nodes字段,自然无法获取全量节点数据

解决思路

我们可以用Ramda自带的R.converge来实现同时读取原数据的多个字段,全程用纯函数实现,不需要外部可变变量:

  1. 先把全量nodes按tableItemId分组,方便后续直接匹配对应章节的节点
  2. 提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:57:02