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

如何使用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)
  ]
}

脚本说明

  1. 遍历.data数组中的每个对象,用$item保存当前对象,避免上下文丢失。
  2. 先构造包含place字段的基础对象。
  3. 用zip($item.values)将id数组和values数组按索引配对,得到形如["7_day_A", 0], ["7_day_B", 30]的配对数组。
  4. 对每一对元素,生成{(.[0]): {value: .[1]}}的键值结构。
  5. 用add将所有小对象合并为一个大对象,再通过+操作符与place对象合并,得到最终的单条数据结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:15:32