如何将递归对象转换为含ID与绝对路径名称的键值对数组?
解决递归JSON结构转绝对路径键值对数组的jq实现
要实现递归结构转带斜杠拼接绝对路径的数组,核心是在遍历节点时跟踪父级路径前缀,通过递归传递并拼接路径。以下是具体实现方案:
关键思路
定义递归函数,每次处理节点时:
- 用当前路径前缀拼接节点名称,生成绝对路径
- 生成当前节点的
{id, name}条目 - 递归处理子节点,将当前节点的路径作为子节点的前缀传递下去
- 最终扁平化所有结果,得到一维数组
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
相关产品推荐
相关产品推荐

