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

JavaScript中如何合并对象数组中的连续时间区间?

合并连续时间区间并排序的实现方案

要实现连续时间区间的合并与最终排序,核心是先将时间转换为可量化的数值便于比较,再按顺序合并,最后转回原格式。以下是完整实现步骤和代码:

实现步骤

  1. 时间转量化值:将12小时制的时间字符串转换为从0点开始的总分钟数,方便后续比较和判断连续性。
  2. 排序区间:按区间的开始时间对原数组排序,确保处理顺序正确。
  3. 合并连续区间:遍历排序后的区间,若当前区间的开始时间等于上一个合并区间的结束时间,则合并两个区间;否则新增一个独立区间。
  4. 转回原时间格式:将合并后的量化时间值转换回12小时制的字符串格式。

完整代码

// 将12小时制时间字符串转换为总分钟数
function timeToMinutes(timeStr) {
  const [time, period] = timeStr.split(/(?=[ap]m)/i);
  let [hours, minutes] = time.split(':').map(Number);
  // 处理12小时制转24小时制的特殊情况
  if (period.toLowerCase() === 'pm' && hours !== 12) hours += 12;
  if (period.toLowerCase() === 'am' && hours === 12) hours = 0;
  return hours * 60 + minutes;
}

// 将总分钟数转换回12小时制时间字符串
function minutesToTime(totalMinutes) {
  let hours = Math.floor(totalMinutes / 60);
  const minutes = totalMinutes % 60;
  const period = hours >= 12 ? 'pm' : 'am';
  // 转换回12小时制格式
  hours = hours % 12;
  hours = hours === 0 ? 12 : hours;
  const minuteStr = minutes.toString().padStart(2, '0');
  return `${hours}:${minuteStr}${period}`;
}

// 合并时间区间主函数
function mergeTimeIntervals(timeArray) {
  // 解析每个区间的开始、结束分钟数
  const parsedIntervals = timeArray.map(item => {
    const [startStr, endStr] = item.timeValue.split('-');
    return {
      start: timeToMinutes(startStr),
      end: timeToMinutes(endStr)
    };
  });

  // 按开始时间排序
  parsedIntervals.sort((a, b) => a.start - b.start);

  // 合并连续区间
  const merged = [];
  for (const interval of parsedIntervals) {
    if (!merged.length) {
      merged.push({ ...interval });
      continue;
    }
    const lastMerged = merged[merged.length - 1];
    // 判断是否连续:当前区间开始等于上一个区间的结束
    if (interval.start === lastMerged.end) {
      lastMerged.end = interval.end;
    } else {
      merged.push({ ...interval });
    }
  }

  // 转换回原格式并返回
  return merged.map(interval => ({
    timeValue: `${minutesToTime(interval.start)}-${minutesToTime(interval.end)}`
  }));
}

// 测试示例
const timeArray = [
  { timeValue: "10:00am-11:00am" },
  { timeValue: "11:00am-12:00pm" },
  { timeValue: "12:00pm-1:00pm" },
  { timeValue: "3:00pm-4:00pm" },
  { timeValue: "4:00pm-5:00pm" },
  { timeValue: "5:00pm-6:00pm" },
  { timeValue: "10:00pm-11:00pm" },
  { timeValue: "7:00pm-8:00pm" },
  { timeValue: "8:00pm-9:00pm" }
];

const newArr = mergeTimeIntervals(timeArray);
console.log(newArr);

代码说明

  • 时间转换函数:timeToMinutes处理12小时制到分钟数的转换,解决了12am/pm的特殊情况;minutesToTime则反向转换,保证输出格式和输入完全一致。
  • 排序逻辑:通过比较分钟数实现精准的时间顺序排序,避免原数组乱序导致的合并错误。
  • 合并逻辑:仅当两个区间首尾相连时才合并,确保非连续区间保持独立。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:25:36