JavaScript如何合并数组中horarioHeader重复的关联对象?
解决方案
原代码问题说明
- 循环终止条件为
i < arr.length - 1,会漏掉数组最后一个元素 - 仅比对相邻元素的
hr_id,如果相同id的条目不连续就会生成多个重复头 - 错误的将
horarioHeader套入数组中,和需求的对象结构不符 - 每次比对都生成新条目推入结果,会导致相同id的条目重复出现在结果里
实现思路
- 用
hr_id作为唯一标识聚合重复的horarioHeader条目 - 先通过临时对象存储已出现的头信息和对应的明细列表,避免重复判断相邻元素
- 遍历完成后将临时对象转为目标数组结构
可运行代码
const formatHorarioData = (arr) => { // 用hr_id作为key的临时映射对象 const headerMap = {}; arr.forEach(item => { const header = item.horarioHeader; const hrId = header.hr_id; // 如果当前hr_id还没存过,初始化条目 if (!headerMap[hrId]) { headerMap[hrId] = { horarioHeader: {...header}, horarioDetalles: [] }; } // 合并当前条目的明细到对应hr_id的列表里 headerMap[hrId].horarioDetalles.push(...item.horarioDetalles); }); // 把映射对象的值转为数组就是最终结果 return Object.values(headerMap); } // 调用示例 const dataFormated = formatHorarioData(data);
代码说明
- 该实现不依赖原始数组中相同
hr_id条目的顺序,不管是不是连续都能正确聚合 - 用展开运算符
...做浅拷贝,避免修改原始数据 - 支持多组不同
hr_id的聚合场景,不止适配示例中的单个id场景
内容的提问来源于stack exchange,提问作者Junior Mena
相关产品推荐
相关产品推荐

