基于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
相关产品推荐
相关产品推荐

