如何使用jq将指定JSON数组转换为目标键值对结构?
问题:将JSON数组中的id与values对应转换为键值对结构
原始输入JSON
{ "data": [ { "place": "FM346", "id": [ "7_day_A", "7_day_B", "7_day_C", "7_day_D" ], "values": [ 0, 30, 23, 43 ] }, { "place": "LH210", "id": [ "1_day_A", "1_day_B", "1_day_C", "1_day_D" ], "values": [ 4, 45, 100, 9 ] } ] }
期望输出JSON
{ "data": [ { "place": "FM346", "7_day_A": { "value": 0 }, "7_day_B": { "value": 30 }, "7_day_C": { "value": 23 }, "7_day_D": { "value": 43 } }, { "place": "LH210", "1_day_A": { "value": 4 }, "1_day_B": { "value": 45 }, "1_day_C": { "value": 100 }, "1_day_D": { "value": 9 } } ] }
问题分析
你之前尝试的脚本中,.id[]和.values[]是独立遍历的,会产生笛卡尔积,导致id与value无法正确对应。解决核心是将两个数组按索引一一配对,再转换为目标键值结构。
解决方案
使用以下jq脚本即可实现预期转换:
{ data: [ .data[] | . as $item | { place: $item.place } + ($item.id | zip($item.values) | map({(.[0]): {value: .[1]}}) | add) ] }
脚本说明
- 遍历
.data数组中的每个对象,用$item保存当前对象,避免上下文丢失。 - 先构造包含
place字段的基础对象。 - 用
zip($item.values)将id数组和values数组按索引配对,得到形如["7_day_A", 0], ["7_day_B", 30]的配对数组。 - 对每一对元素,生成
{(.[0]): {value: .[1]}}的键值结构。 - 用
add将所有小对象合并为一个大对象,再通过+操作符与place对象合并,得到最终的单条数据结构。
内容的提问来源于stack exchange,提问作者skeleton_mouse
相关产品推荐
相关产品推荐

