如何用JQ按users中的extId分组重复项并保留关联数据
按extId分组用户并合并关联connections的JQ实现
核心思路
用group_by(.extId)对用户数组分组,再遍历每个分组合并所有connections数据,避免像INDEX(.extId)那样自动去重。
示例输入JSON
{ "users": [ { "extId": "123", "name": "Alice", "connections": [{"id": "conn1"}] }, { "extId": "123", "name": "Alice", "connections": [{"id": "conn2"}] }, { "extId": "456", "name": "Bob", "connections": [{"id": "conn3"}] } ] }
JQ命令实现
.users | group_by(.extId) | map({ extId: .[0].extId, name: .[0].name, # 若同extId的name存在差异,可根据需求调整处理逻辑 connections: map(.connections) | flatten })
命令解释
.users:提取顶层的users数组group_by(.extId):将users数组按extId字段分组,生成二维数组(每个子数组对应同一extId的所有用户)map(...):遍历每个分组,构造合并后的对象:- 取分组第一个元素的extId和基础字段(假设同extId的基础字段一致,若不一致可改为
map(.name) | unique之类的逻辑) map(.connections) | flatten:提取分组内所有用户的connections数组,再扁平化合并为一个数组
- 取分组第一个元素的extId和基础字段(假设同extId的基础字段一致,若不一致可改为
预期输出
[ { "extId": "123", "name": "Alice", "connections": [{"id": "conn1"}, {"id": "conn2"}] }, { "extId": "456", "name": "Bob", "connections": [{"id": "conn3"}] } ]
特殊场景处理(若同extId的用户基础字段有差异)
如果需要保留同一extId下的所有用户原始数据,同时合并connections,可改用以下命令:
.users | group_by(.extId) | map({ extId: .[0].extId, users: ., connections: map(.connections) | flatten })
内容的提问来源于stack exchange,提问作者ICIM
相关产品推荐
相关产品推荐

