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

如何基于时间重叠周期对对象数组进行分组?

按时间重叠规则分组时间段对象

以下是实现「时间段重叠则新建行,不重叠则加入无重叠行」分组逻辑的方案,完全匹配你给出的示例需求:

核心思路

遍历每个时间段,优先将其加入已有行的末尾——仅当该行最后一个时间段和当前时间段无重叠时;如果所有行的最后一个时间段都和当前时间段重叠,就新建一行存放当前时间段。

实现代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:12:31