如何使用JQ基于值合并对象数组并实现分组嵌套?
问题:基于共享值对JSON数组对象分组嵌套
我创建了一个包含多个对象的JSON数组,需要基于muleVersion对这些对象进行分组,并将每个组中对应的s2iVersion整理为唯一值的子数组,但始终无法实现该需求。
输入数据
[{"name": "pcmp-ingestion-master","s2iVersion": "4.5.0-05","muleVersion": "4.5.0","imageSha": "sha256:c1b618c6fbec2e2832824578a47893707ebea8a681bab1ce97b73b1a1e2fccb5"},{"name": "pcmp-ingestion-syst","s2iVersion": "4.4.0-87","muleVersion": "4.4.0","imageSha": "sha256:c1b618c6fbec2e2832824578a47893707ebea8a681bab1ce97b73b1a1e2fccb5"},{"name": "pcmp-ingestion-uat","s2iVersion": "4.4.0-87","muleVersion": "4.4.0","imageSha": "sha256:c1b618c6fbec2e2832824578a47893707ebea8a681bab1ce97b73b1a1e2fccb5"},{"name": "qualityofhire-uat","s2iVersion": "4.4.0-85","muleVersion": "4.4.0","imageSha": "sha256:baabd127862667b17bda7ff278144314469205c12d1445295dc3cf0001ac79db"},{"name": "virtual-assist-uat","s2iVersion": "4.4.0-85","muleVersion": "4.4.0","imageSha": "sha256:b82d58aa174fe668061e41453d11212e9162381f8b20a2db3b9a525e6b981140"}]
期望输出
[{"muleVersion": "4.4.0","s2iVersions": ["4.4.0-87","4.4.0-85"]},{"muleVersion": "4.5.0","s2iVersions": ["4.5.0-05"]}]
(注:原期望输出中的4.6.0相关条目在输入数据中不存在,此处按实际输入调整)
尝试过的命令及不理想输出
我使用了以下jq命令:
map( { muleVersion: .muleVersion, "s2iVersions": ([.s2iVersion])}) | unique_by(.s2iVersions)
得到的输出是:
[{"muleVersion": "4.4.0","s2iVersions": ["4.4.0-85"]},{"muleVersion": "4.4.0","s2iVersions": ["4.4.0-87"]},{"muleVersion": "4.5.0","s2iVersions": ["4.5.0-05"]}]
这个结果只是平铺映射并选择了唯一的s2iVersions值,没有按muleVersion合并分组。
解决思路及正确命令
要实现按muleVersion分组并收集唯一s2iVersion的需求,可以利用jq的group_by和unique函数组合:
group_by(.muleVersion) | map({ muleVersion: .[0].muleVersion, s2iVersions: [.[].s2iVersion] | unique })
命令解释:
group_by(.muleVersion):将原数组按muleVersion字段分组,得到一个二维数组,每一组内是具有相同muleVersion的对象。map(...):遍历每个分组,构造新的对象:muleVersion: .[0].muleVersion:取分组中第一个对象的muleVersion作为该组的标识(同组内所有对象的muleVersion一致)。s2iVersions: [.[].s2iVersion] | unique:提取分组内所有对象的s2iVersion组成数组,再通过unique去重,得到该组对应的唯一s2iVersion列表。
执行上述命令后,就能得到符合期望的分组嵌套结果。
内容的提问来源于stack exchange,提问作者Adam Blyde
相关产品推荐
相关产品推荐

