JavaScript如何过滤与指定时间区间无重叠的ISO日期对象
时间区间过滤最简实现
不需要枚举所有5种交互场景写大量if-else分支,判断两个时间区间是否重叠有非常简洁的反向逻辑:
两个区间不发生重叠的情况只有两种,其余所有场景都属于重叠/落在区间内,直接排除即可:
- 列表项的结束时间早于或等于assignment的开始时间(整段完全在目标区间之前)
- 列表项的开始时间晚于或等于assignment的结束时间(整段完全在目标区间之后)
结合你正在使用的Luxon库,先把ISO格式的时间字符串转为DateTime实例做数值比较(避免原生字符串时间比较的潜在兼容问题),实现代码非常精简:
import { DateTime } from 'luxon'; // 提前转换assignment的时间,避免循环内重复计算 const assignStart = DateTime.fromISO(assignment.startTime); const assignEnd = DateTime.fromISO(assignment.endTime); const result = list.filter(item => { const itemStart = DateTime.fromISO(item.startTime); const itemEnd = DateTime.fromISO(item.endTime); // 仅保留完全不重叠的条目 return itemEnd <= assignStart || itemStart >= assignEnd; });
逻辑说明
你梳理的5种场景里:
- Scenario1、Scenario5对应上述判断覆盖的不重叠场景,会被保留在结果中
- Scenario2、Scenario3、Scenario4都属于重叠场景,不满足不重叠判断条件,会被自动过滤
如果你的业务规则对边界判定有不同要求,比如「前一段的结束时间和后一段的开始时间相等也算冲突」,只需要把判断条件里的<=改为<、>=改为>即可适配。
用你给出的示例数据运行这段代码,得到的结果和你预期的result完全一致。
内容的提问来源于stack exchange,提问作者h_a
相关产品推荐
相关产品推荐

