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

如何对JSON中的相似子项进行分组并合并其下属子项

合并JSON中的相似子项并整合下属内容

首先得明确**“相似子项”的判断标准**——这里我假设你是想按errs中的user字段来合并(如果你的相似判断是其他字段,比如details的name或者year的name,可以直接调整代码中的分组key)。下面是针对你提供的JSON结构,实现跨层级合并相似子项并整合下属内容的具体方案:

实现思路

  1. 层级遍历与数据收集:先遍历到目标子项的上层(比如details下的year数组),把所有需要合并的子项(比如errs)和它们的关联信息(比如所属的year)收集起来。
  2. 按相似key分组:用Map来存储分组,key是相似判断的字段值(比如user),value是整合后的组对象。
  3. 整合下属子项:在分组过程中,把每个子项的下属内容(比如year、text)去重后整合到对应的组里。
  4. 重构JSON结构:将分组后的结果替换或添加到原JSON的对应位置。

具体代码实现(JavaScript)

// 处理原始JSON数据的函数
function mergeSimilarErrGroups(originalData) {
  return {
    car: originalData.car.map(car => ({
      ...car,
      details: car.details.map(detail => {
        // 收集所有年份下的错误,并关联年份信息
        const allErrsWithYear = detail.year.flatMap(yearItem => 
          yearItem.errs.map(err => ({ ...err, sourceYear: yearItem.name }))
        );

        // 按user字段分组,整合年份和错误文本
        const groupedErrs = new Map();
        allErrsWithYear.forEach(err => {
          if (groupedErrs.has(err.user)) {
            const existingGroup = groupedErrs.get(err.user);
            // 年份去重添加
            if (!existingGroup.sourceYears.includes(err.sourceYear)) {
              existingGroup.sourceYears.push(err.sourceYear);
            }
            // 错误文本去重添加
            if (!existingGroup.errorTexts.includes(err.text)) {
              existingGroup.errorTexts.push(err.text);
            }
          } else {
            groupedErrs.set(err.user, {
              user: err.user,
              sourceYears: [err.sourceYear],
              errorTexts: [err.text]
            });
          }
        });

        // 返回整合后的detail对象(可以选择保留原year数组或替换)
        return {
          ...detail,
          mergedErrGroups: Array.from(groupedErrs.values())
        };
      })
    }))
  };
}

// 示例使用
const originalJson = {
  "car": [
    {
      "name": "benz",
      "details": [
        {
          "name": "C1",
          "year": [
            {
              "name": "1850",
              "errs": [
                { "user": "model-A", "text": "error text on model-H" },
                { "user": "model-C", "text": "error text on model-C" }
              ]
            },
            {
              "name": "1820",
              "errs": [
                { "user": "model-C", "text": "error text on model-C" }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "vw",
      "details": [
        { "name": "A1", "year": [] }
      ]
    }
  ]
};

// 执行合并
const mergedJson = mergeSimilarErrGroups(originalJson);
// 打印结果
console.log(JSON.stringify(mergedJson, null, 2));

输出结果

执行后,你会得到整合后的JSON,其中benz的C1详情下新增了mergedErrGroups数组,里面是按user合并后的组:

{
  "car": [
    {
      "name": "benz",
      "details": [
        {
          "name": "C1",
          "year": [
            // 原year数组保留(如果不需要可以删除)
          ],
          "mergedErrGroups": [
            {
              "user": "model-A",
              "sourceYears": ["1850"],
              "errorTexts": ["error text on model-H"]
            },
            {
              "user": "model-C",
              "sourceYears": ["1850", "1820"],
              "errorTexts": ["error text on model-C"]
            }
          ]
        }
      ]
    },
    {
      "name": "vw",
      "details": [
        { "name": "A1", "year": [], "mergedErrGroups": [] }
      ]
    }
  ]
}

灵活调整

如果你的相似判断标准不是user,比如要合并details中相同name的项,只需要修改分组的key字段,并调整遍历的层级即可。比如把遍历层级提到car下的details数组,按name分组,整合year数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:08:51