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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:01:33