如何对JSON中的相似子项进行分组并合并其下属子项
合并JSON中的相似子项并整合下属内容
首先得明确**“相似子项”的判断标准**——这里我假设你是想按errs中的user字段来合并(如果你的相似判断是其他字段,比如details的name或者year的name,可以直接调整代码中的分组key)。下面是针对你提供的JSON结构,实现跨层级合并相似子项并整合下属内容的具体方案:
实现思路
- 层级遍历与数据收集:先遍历到目标子项的上层(比如
details下的year数组),把所有需要合并的子项(比如errs)和它们的关联信息(比如所属的year)收集起来。 - 按相似key分组:用Map来存储分组,key是相似判断的字段值(比如
user),value是整合后的组对象。 - 整合下属子项:在分组过程中,把每个子项的下属内容(比如
year、text)去重后整合到对应的组里。 - 重构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
相关产品推荐
相关产品推荐

