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

基于唯一标识字段的JQ递归去重与合并JSON对象方案问询

基于ID字段的JSON对象递归去重与合并需求

我需要基于每个JSON对象中的ID字段,对多个JSON对象执行去重与合并操作。以下示例中,将通过employee.id和hobbygroup.id字段的值判断是移除重复项,还是在保留层级结构的前提下合并不同值:

{
   "employee":[
      {
         "employee.id":"11",
         "employee.name":"bob",
         "hobbygroup":{
            "hobbygroup.id":"1",
            "hobbygroup.name":"chess",
            "groupmeeting":{
               "groupmeeting.id":"a",
               "groupmeeting.name":"kickoff meeting"
            }
         }
      },
      { // 新的hobbygroup.id,将与上方hobbygroup "1" 合并为数组
         "employee.id":"11",
         "employee.name":"bob",
         "hobbygroup":{
            "hobbygroup.id":"2",
            "hobbygroup.name":"boxing",
            "groupmeeting":{
               "groupmeeting.id":"a",
               "groupmeeting.name":"kickoff meeting"
            }
         }
      },
      { // employee.id和hobbygroup.id与之前一致,但groupmeeting为新项,将与groupmeeting "a" 合并为数组
         "employee.id":"11",
         "employee.name":"bob",
         "hobbygroup":{
            "hobbygroup.id":"2",
            "hobbygroup.name":"boxing",
            "groupmeeting":{
               "groupmeeting.id":"b",
               "groupmeeting.name":"second meeting"
            }
         }
      },
      { // employee.id和hobbygroup.id均重复,将被去重忽略
         "employee.id":"11",
         "employee.name":"bob",
         "hobbygroup":{
            "hobbygroup.id":"2",
            "hobbygroup.name":"boxing"
         }
      },
      { // 新的employee.id,将与employee 11合并为数组
         "employee.id":"12",
         "employee.name":"bill",
         "hobbygroup":{
            "hobbygroup.id":"1",
            "hobbygroup.name":"chess",
            "groupmeeting":{
               "groupmeeting.id":"a",
               "groupmeeting.name":"kickoff meeting"
            }
         }
      }
   ]
}

预期返回结果

{
   "employee":[
      {
         "employee.id":"11",
         "employee.name":"bob",
         "hobbygroup":[
            {
               "hobbygroup.id":"1",
               "hobbygroup.name":"chess",
               "groupmeeting":{
                  "groupmeeting.id":"a",
                  "groupmeeting.name":"kickoff meeting"
               }
            },
            {
               "hobbygroup.id":"2",
               "hobbygroup.name":"boxing",
               "groupmeeting":[
                  {
                     "groupmeeting.id":"a",
                     "groupmeeting.name":"kickoff meeting"
                  },
                  {
                     "groupmeeting.id":"b",
                     "groupmeeting.name":"second meeting"
                  }
               ]
            }
         ]
      },
      {
         "employee.id":"12",
         "employee.name":"bill",
         "hobbygroup":{
            "hobbygroup.id":"11",
            "hobbygroup.name":"chess",
            "groupmeeting":{
               "groupmeeting.id":"a",
               "groupmeeting.name":"kickoff meeting"
            }
         }
      }
   ]
}

示例说明

  • 在第一层级,若两个对象的employee.id值匹配:
    1. 对象的子字段(如employee.name)将被去重/覆盖;
    2. 子对象(如hobbygroup)需检查其对应ID字段(hobbygroup.id)是否匹配:
      • 若匹配,则对该对象递归应用上述规则(合并字段,再处理子对象的子层级);
      • 若不匹配,则将这两个hobbygroup对象合并为父对象(employee)下的数组,格式为"hobbygroup": [{chess...}, {boxing...}]

潜在输入特性

  • 输入JSON可包含任意层级的嵌套结构;
  • 每个对象都有一个去重键字段(如示例中的employee.id和hobbygroup.id),可预先统一重命名为key.id以简化处理;
  • 解决方案需具备通用性,支持递归处理,无需预先知晓字段名称或嵌套结构。

当前尝试

我已经找到一些关于合并JSON对象的讨论,其中有实现类似递归合并乘法操作(*)的函数,但遇到数组时会直接合并。我觉得可以在此基础上增加ID字段的条件判断(仅当ID不匹配时才合并为数组),但因为刚接触JQ,想找更简洁的声明式解决方案,特此求助。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:40:35