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

基于labels字典分组合并targets列表的jq表达式需求

按labels分组合并targets的jq表达式

我明白你想要的是按完整匹配的labels对象对JSON数组分组,把同组条目的targets列表合并到一起——之前用group_by和reduce没得到预期结果,应该是组合方式的问题,我来给你拆解正确的写法:

核心jq表达式

group_by(.labels) | map({
  labels: .[0].labels,
  targets: reduce .[] as $item ([]; . + $item.targets)
})

代码解释

  • group_by(.labels):这一步是关键,jq会递归比较每个元素的labels对象(不管里面有多少键,只要键值对完全一致就会分到同一组),正好适配你说的labels键列表可能变化的场景。
  • map(...):遍历每个分组,生成最终的输出条目:
    • labels: .[0].labels:因为同一组里的所有元素labels都完全相同,直接取第一个元素的labels即可。
    • targets: reduce .[] as $item ([]; . + $item.targets):用reduce遍历分组里的每个元素,把它们的targets列表逐个合并成一个新的数组。

测试示例

输入(JSON)

[{ "targets": [ "host1" ], "labels": { "platform": "VMware", "os": "Windows", "datacenter": "dc1", "environment": "Production" } },{ "targets": [ "host2" ], "labels": { "platform": "VMware", "os": "Windows", "datacenter": "dc1", "environment": "Production" } }, { "targets": [ "host3" ], "labels": { "platform": "VMware", "os": "Windows", "datacenter": "dc2", "environment": "Production" } } ]

输出(JSON)

[{ "targets": [ "host1", "host2" ], "labels": { "platform": "VMware", "os": "Windows", "datacenter": "dc1", "environment": "Production" } }, { "targets": [ "host3" ], "labels": { "platform": "VMware", "os": "Windows", "datacenter": "dc2", "environment": "Production" } } ]

可选优化

如果你的targets列表可能出现重复值,想要去重的话,可以把reduce部分改成:

targets: reduce .[] as $item ([]; . + $item.targets | unique)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:23:16