如何筛选出时间间隔在30分钟以内的分组事件?
实现方法
核心思路
既然已经按天完成事件分组,只需要对每一天内的事件先按时间排序,再遍历检查相邻事件的时间间隔,把符合条件的事件(或事件组)收集到Interval数组即可。
具体代码实现
假设你的分组后数据结构是{ 日期字符串: [事件对象数组] },每个事件包含startTime字段(ISO时间字符串或时间戳):
场景1:收集所有与相邻事件间隔≤30分钟的事件(去重)
const Interval = []; // 遍历每一天的事件组 Object.values(groupedEvents).forEach(dailyEvents => { // 第一步:按事件发生时间从小到大排序 const sortedEvents = dailyEvents.sort((a, b) => new Date(a.startTime) - new Date(b.startTime)); // 第二步:遍历检查相邻事件的时间差 sortedEvents.forEach((event, idx) => { if (idx === 0) return; // 第一个事件没有前序事件,跳过 const prevEvent = sortedEvents[idx - 1]; const timeDiff = new Date(event.startTime) - new Date(prevEvent.startTime); const thirtyMinMs = 30 * 60 * 1000; // 30分钟对应的毫秒数 if (timeDiff <= thirtyMinMs) { // 避免重复添加同一个事件 if (!Interval.includes(prevEvent)) Interval.push(prevEvent); if (!Interval.includes(event)) Interval.push(event); } }); });
场景2:收集连续的事件组(比如A-B-C互相间隔≤30分钟,作为一个组存入)
如果需要把连续满足间隔条件的事件作为整体存入Interval,可以用以下逻辑:
const Interval = []; Object.values(groupedEvents).forEach(dailyEvents => { const sortedEvents = dailyEvents.sort((a, b) => new Date(a.startTime) - new Date(b.startTime)); let currentGroup = []; sortedEvents.forEach((event, idx) => { currentGroup.push(event); // 最后一个事件直接进入收尾判断 if (idx === sortedEvents.length - 1) return; const nextEvent = sortedEvents[idx + 1]; const timeDiff = new Date(nextEvent.startTime) - new Date(event.startTime); const thirtyMinMs = 30 * 60 * 1000; // 间隔超过30分钟时,结束当前组(组内事件≥2才存入) if (timeDiff > thirtyMinMs) { if (currentGroup.length >= 2) { Interval.push([...currentGroup]); } currentGroup = []; } }); // 处理最后一组未存入的事件 if (currentGroup.length >= 2) { Interval.push([...currentGroup]); } });
注意事项
- 如果事件的时间字段是时间戳(数值类型),直接用
event.startTime - prevEvent.startTime计算差值即可,无需new Date转换。 - 如果需要更精确的时间比较(比如排除日期影响,只看时分秒),可以在排序和计算差值时,提取事件时间的时分秒部分转换为分钟数再比较。
内容的提问来源于stack exchange,提问作者TenB
相关产品推荐
相关产品推荐

