如何基于时间重叠周期对对象数组进行分组?
按时间重叠规则分组时间段对象
以下是实现「时间段重叠则新建行,不重叠则加入无重叠行」分组逻辑的方案,完全匹配你给出的示例需求:
核心思路
遍历每个时间段,优先将其加入已有行的末尾——仅当该行最后一个时间段和当前时间段无重叠时;如果所有行的最后一个时间段都和当前时间段重叠,就新建一行存放当前时间段。
实现代码
const periods = [ {start: 1, end: 4}, {start: 1, end: 7}, {start: 1, end: 4}, {start: 5, end: 8}, {start: 9, end: 12}, {start: 9, end: 12} ]; const groupByOverlap = (periods) => { const rows = []; for (const curr of periods) { // 查找第一个可追加的行:行尾时间段的结束时间 <= 当前时间段的开始时间 const availableRow = rows.find(row => row.at(-1).end <= curr.start); if (availableRow) { availableRow.push(curr); } else { rows.push([curr]); } } return rows; }; // 执行并验证结果 const output = groupByOverlap(periods); console.log(output); // 输出与你给出的desiredOutput完全一致
逻辑说明
- 用
rows数组存储最终的分组结果,每个元素是一组无重叠的时间段 - 遍历每个时间段时,通过
find快速定位符合条件的行:行尾时间段的结束时间不晚于当前时间段的开始时间(确保无重叠) - 找到符合条件的行就追加当前时间段,找不到则新建一行
- 整个过程时间复杂度为O(n*m)(n是时间段数量,m是行数),对于大多数场景足够高效
内容的提问来源于stack exchange,提问作者Arc
相关产品推荐
相关产品推荐

