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

如何编写可复用的jq分组函数,返回以分组为键的对象?

通用jq分组转对象解决方案

要实现将数组按指定字段分组并转换为「键为分组值、值为对应元素数组」的结构,这里提供两种通用的可复用方案,适配不同场景需求:

方案1:无排序的高效分组(保留原顺序)

这种方式使用reduce直接遍历数组构建结果,不会对分组键排序,同时保留原数组中元素的顺序,性能更优。

可复用函数定义

def group_to_object(key):
  reduce .[] as $elem ({};
    .[$elem|key] += [$elem]
  );

使用示例

针对你的输入数据,调用函数时指定分组字段路径即可:

jq 'group_to_object(.country)' input.json

执行后得到目标结构:

{
  "germany": [
    {
      "name": "anna",
      "country": "germany"
    },
    {
      "name": "lisa",
      "country": "germany"
    }
  ],
  "usa": [
    {
      "name": "john",
      "country": "usa"
    }
  ]
}

函数原理

  • reduce .[] as $elem ({}; ...):遍历输入数组的每个元素$elem,初始值为空白对象{}
  • .[$elem|key] += [$elem]:将当前元素添加到对应分组的数组中,如果键不存在会自动创建数组

方案2:带排序的分组

如果需要分组键按自然顺序排列,可以结合group_by和from_entries实现:

可复用函数定义

def sorted_group_to_object(key):
  group_by(key) | map({key: .[0]|key, value: .}) | from_entries;

使用示例

同样针对输入数据调用:

jq 'sorted_group_to_object(.country)' input.json

得到的结果会对分组键排序(字符串按字典序,数字按数值序),示例中结果和方案1一致(germany在usa前),如果分组键是其他值会自动排序。

函数原理

  • group_by(key):按指定字段分组,返回数组的数组(自动排序分组)
  • map({key: .[0]|key, value: .}):将每个分组转换为{key: 分组值, value: 分组数组}的结构
  • from_entries:将上述结构转换为最终的键值对对象

导入函数到其他jq程序

将函数保存到单独的文件(比如jq-utils.jq),在其他jq脚本或命令中可以通过以下方式使用:

  1. 命令行调用:
    jq -f jq-utils.jq 'group_to_object(.your_field)' input.json
    
  2. jq脚本中引用(jq 1.6+支持):
    include "jq-utils";
    group_to_object(.your_field)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:05:22