JavaScript中如何合并对象数组中的连续时间区间?
合并连续时间区间并排序的实现方案
要实现连续时间区间的合并与最终排序,核心是先将时间转换为可量化的数值便于比较,再按顺序合并,最后转回原格式。以下是完整实现步骤和代码:
实现步骤
- 时间转量化值:将12小时制的时间字符串转换为从0点开始的总分钟数,方便后续比较和判断连续性。
- 排序区间:按区间的开始时间对原数组排序,确保处理顺序正确。
- 合并连续区间:遍历排序后的区间,若当前区间的开始时间等于上一个合并区间的结束时间,则合并两个区间;否则新增一个独立区间。
- 转回原时间格式:将合并后的量化时间值转换回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
相关产品推荐
相关产品推荐

