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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:36:05