JQ如何合并相同属性的数组实体并拼接数组字段
JQ实现同ID对象数组合并去重方案
原有命令问题
你之前的命令存在两个核心问题:
- 分组字段写错:使用了示例数据中不存在的
.media_url作为group_by的分组键,根本无法按some_id完成分组 - 合并逻辑错误:直接使用
add合并对象时,同名字段会被后面对象的值直接覆盖,不会对数组类型字段做累加、去重操作,自然得不到预期结果
可直接运行的正确命令
如果你的字段固定为some_id、items_1、items_2,直接运行下面的命令即可:
jq ' group_by(.some_id) | map( reduce .[] as $item ( {some_id: .[0].some_id, items_1: [], items_2: []}; .items_1 += $item.items_1 | .items_2 += $item.items_2 ) | .items_1 |= unique | .items_2 |= unique ) ' test.json
通用版本(无需硬编码数组字段)
如果后续可能新增其他数组类型字段、不想每次修改命令,可以用自动识别字段的通用版本,会自动保留非数组的公共字段,对所有数组类型字段做合并去重:
jq ' group_by(.some_id) | map( reduce .[] as $item (.[0]; to_entries | map( if .value | type == "array" then .value = ($item[.key] // []) + .value else . end ) | from_entries ) | with_entries( if .value | type == "array" then .value |= unique else . end ) ) ' test.json
逻辑说明
- 首先通过
group_by(.some_id)将所有some_id相同的对象分到同一组 - 用
reduce遍历组内每一个对象,把所有对象的数组字段元素逐个累加 - 最后对所有累加完成的数组字段执行
unique去重,jq原生支持基础类型、对象类型的去重判断,不需要额外写判断逻辑 - 运行后输出结果和你给出的预期结构完全一致:
[ { "some_id": "123", "items_1": [ { "label": "my_name" } ], "items_2": [ "value_1", "value_2", "value_3" ] } ]
内容的提问来源于stack exchange,提问作者Navjot
相关产品推荐
相关产品推荐

