JavaScript 重叠时间区间顺延调整功能实现问题
区间重叠修正实现方案
核心处理逻辑
- 第一步:先将所有区间按原始
start值升序排序,保证按照时间从早到晚的顺序处理区间 - 第二步:提前计算每个区间的固定时长
duration = end - start,这个值后续不会变更 - 第三步:遍历排序后的区间,维护上一个处理完成的区间的
end值作为当前区间的最早允许开始时间:- 若当前区间的原始
start大于等于上一个区间的end,说明无重叠,直接保留原始的start和end即可 - 若当前区间的原始
start小于上一个区间的end,说明存在重叠,将当前区间的start调整为上一个区间的end,新的end等于调整后的start加上预先计算的固定时长
- 若当前区间的原始
- 第四步:输出处理完成的区间数组即可
注意事项
如果需要严格保留原始数组的元素顺序,不需要按start排序,可以在处理前给每个区间标记原始索引,处理完成后再按原始索引重排即可。
JavaScript 代码实现
function adjustOverlappingIntervals(intervals) { // 按原始start升序排序 const sortedIntervals = [...intervals].sort((a, b) => a.start - b.start); const result = []; let prevEnd = -Infinity; for (const interval of sortedIntervals) { // 计算当前区间固定时长 const duration = interval.end - interval.start; let newStart = interval.start; // 重叠则调整start if (newStart < prevEnd) { newStart = prevEnd; } const newEnd = newStart + duration; result.push({ ...interval, start: newStart, end: newEnd }); // 更新上一个区间的end值 prevEnd = newEnd; } return result; }
测试验证
输入示例数据:
const input = [ {key: 'a', start: 0, end: 100}, {key: 'b', start: 10, end: 30}, {key: 'c', start: 110, end: 200}, {key: 'd', start: 300, end: 400}, ]; console.log(adjustOverlappingIntervals(input));
输出结果和要求完全一致:
[ {key: 'a', start: 0, end: 100}, {key: 'b', start: 100, end: 120}, {key: 'c', start: 120, end: 210}, {key: 'd', start: 300, end: 400} ]
内容的提问来源于stack exchange,提问作者Luiz Eduardo
相关产品推荐
相关产品推荐

