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

如何基于键名重构JSON数组?jq批量处理所有键的方法

用JQ批量处理所有键,重组数组结构

原始数据

{
  "data": [
    {
      "a": 11,
      "b": 12,
      "c": 13
    },
    {
      "a": 21,
      "b": 22,
      "c": 23
    },
    {
      "a": 31,
      "b": 32,
      "c": 33
    }
  ]
}

目标结构

希望将数据重组为每个键对应一个值数组的形式:

{
  "data": [
    {
      "a": [
        11,
        21,
        31
      ]
    },
    {
      "b": [
        12,
        22,
        32
      ]
    },
    {
      "c": [
        13,
        23,
        33
      ]
    }
  ]
}

现有单键处理代码

目前能处理单个指定键的JQ命令:

jq '(.data[0]|keys_unsorted) as $keys | { ($keys[2]): [.data[]|.[$keys[2]]] }' data.json

执行结果仅输出指定键的数组:

{
  "c": [
    13,
    23,
    33
  ]
}

解决方案

要批量处理所有键,只需对获取到的键数组进行遍历映射,为每个键生成对应的键值对对象,最后将这些对象包裹到data数组中。

使用以下JQ命令:

jq '(.data[0]|keys_unsorted) as $keys | { data: [$keys[] | { (.): [.data[]|.[.]] }] }' data.json

代码解释

  1. (.data[0]|keys_unsorted) as $keys:获取第一个对象的所有键,保持原始顺序并存为变量$keys
  2. $keys[]:遍历每个键
  3. { (.): [.data[]|.[.]] }:对当前遍历的键,生成一个以该键为键名,值为所有数据对象中该键对应值组成的数组的对象
  4. [$keys[] | ...]:将所有生成的对象收集为一个数组
  5. { data: [...] }:将这个数组包裹到data字段中,得到目标结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:57:32