JQ按值分组合并对象:实现特定属性拼接而非覆盖
JQ按指定值分组合并时拼接特定属性的解决方案
当使用JQ按指定字段(如location)分组合并对象时,默认的add操作会让后续对象的属性覆盖前一个,若想让特定属性(如type)实现字符串拼接而非覆盖,可以通过以下两种方式实现:
方法一:通用合并逻辑(支持多属性自定义处理)
使用reduce遍历每组内的对象,针对目标属性做拼接处理,其他属性按需赋值:
group_by(.location) | map( reduce .[] as $item ({}; .location = $item.location | .type += (if .type then "," else "" end) + $item.type | .host = $item.host ) )
- 核心逻辑:初始化空对象后,逐个合并组内对象;
type属性判断是否已有值,存在则先加分隔符再拼接新值,不存在则直接赋值 - 优势:可灵活扩展其他属性的合并规则,适合同组内非目标属性可能存在差异的场景
方法二:简洁版(适合同组内非目标属性一致的场景)
如果同组内除了需要拼接的属性外,其他属性完全相同,可以直接取组内第一个对象,替换目标属性为所有值的拼接结果:
group_by(.location) | map( (.[].type | unique | join(",")) as $combinedType | .[0] | .type = $combinedType )
- 核心逻辑:先提取组内所有
type值,去重后用逗号连接,再替换第一个对象的type属性 - 优势:代码更简洁高效,适合非目标属性无差异的场景
内容的提问来源于stack exchange,提问作者Jim Hastings
相关产品推荐
相关产品推荐

