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

如何将递归对象转换为含ID与绝对路径名称的键值对数组?

解决递归JSON结构转绝对路径键值对数组的jq实现

要实现递归结构转带斜杠拼接绝对路径的数组,核心是在遍历节点时跟踪父级路径前缀,通过递归传递并拼接路径。以下是具体实现方案:

关键思路

定义递归函数,每次处理节点时:

  1. 用当前路径前缀拼接节点名称,生成绝对路径
  2. 生成当前节点的{id, name}条目
  3. 递归处理子节点,将当前节点的路径作为子节点的前缀传递下去
  4. 最终扁平化所有结果,得到一维数组

jq实现代码

假设你的输入JSON结构如下(示例):

{
  "id": 1,
  "name": { "data": "foo" },
  "children": [
    {
      "id": 2,
      "name": { "data": "bar" },
      "children": [
        { "id": 3, "name": { "data": "melon" } }
      ]
    },
    { "id": 4, "name": { "data": "apple" } }
  ]
}

使用以下jq命令:

def process($path):
  [
    { 
      id: .id, 
      name: ($path | if length == 0 then .name.data else "\($path)/\(.name.data)" end) 
    }
  ] + (.children? // [] | map(process(
    $path | if length == 0 then .name.data else "\($path)/\(.name.data)" end
  )) | flatten);

process("")

输出结果

执行后将得到目标数组:

[
  {"id":1,"name":"foo"},
  {"id":2,"name":"foo/bar"},
  {"id":3,"name":"foo/bar/melon"},
  {"id":4,"name":"foo/apple"}
]

原表达式问题分析

你之前的表达式.. | (.children? // empty) | .[] | { id: .id, name: .name.data }仅通过深度遍历提取了所有节点的单个名称,但没有在遍历过程中记录父级路径,因此无法生成拼接后的绝对路径。

内容的提问来源于stack exchange,提问作者user-id-14900042

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:44:54