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

jq技术问询:如何基于数组配置用指定键值生成嵌套键结构

jq实现方案

核心命令

del(.arr) + reduce .arr[] as $item ({};
  ($item.result | ltrimstr(".") | split(".")) as $path;
  ($item.vals | map(getpath(ltrimstr(".") | split(".")))) as $values;
  setpath($path; ($item.fmt | printf($values[])))
)

命令拆解

  • del(.arr):删除原JSON中的arr字段,保留原有A、B、C键值对
  • reduce .arr[] as $item ({}; ...):遍历arr数组的每个配置项,从零开始构建嵌套结构
  • ($item.result | ltrimstr(".") | split(".")) as $path:将result中的路径字符串(如.R1.R3)去除开头的.后拆分为键数组(如["R1", "R3"])
  • ($item.vals | map(getpath(ltrimstr(".") | split(".")))) as $values:解析vals中的每个路径,获取对应字段的值(如[".A", ".B"]会提取出[100, 200])
  • setpath($path; ($item.fmt | printf($values[]))):使用setpath将格式化后的字符串(通过printf结合fmt模板和values生成)写入指定的嵌套路径
  • +:将保留的原有字段与新生成的嵌套结构合并,得到最终结果

运行方式

将上述jq命令直接在命令行执行,指定输入文件:

jq 'del(.arr) + reduce .arr[] as $item ({}; ($item.result | ltrimstr(".") | split(".")) as $path; ($item.vals | map(getpath(ltrimstr(".") | split(".")))) as $values; setpath($path; ($item.fmt | printf($values[])))' input.json

效果验证

输入指定的JSON数据后,会输出符合要求的结果:保留A、B、C,同时生成R1、R2嵌套结构。

内容的提问来源于stack exchange,提问作者Anton Romanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:27:39