JS判断所选不同时间段是否有重叠

292 阅读1分钟

在项目中遇到一个场景选取时间段范围要求各个范围并且时间范围不允许重叠 例如

[{start:'00:00',end:'08:00'},{start:'08:00',end:'16:00'},{start:'16:00',end:'24:00'}]

这样的数据是没有重叠的 反之

[{start:'00:00',end:'08:00'},{start:'05:00',end:'16:00'},{start:'16:00',end:'24:00'}]

这样的结构是有重叠

实现思路如下 1.先将数组数据的时间转换为分钟

export function parseTime(timeStr) {
  const [hours, minutes] = timeStr.split(':').map(Number)
  return hours * 60 + (minutes || 0)
}

2.然后将转换后的数组按照开始时间排序

 parsedPeriods.sort((a, b) => a.start - b.start)

3.开始比对 比对的逻辑就是按照排好序的数组 拿前一个的结束时间与后一个的开始时间进行比对

  for (let i = 0; i < parsedPeriods.length - 1; i++) {
    if (parsedPeriods[i].end > parsedPeriods[i + 1].start) {
      return true // 有重叠
    }
  }

完整代码如下

 function parseTimeOne(timeStr) {
  const [hours, minutes] = timeStr.split(':').map(Number)
  console.log(hours, minutes)
  return hours * 60 + (minutes || 0)
}
// 检测时间段是否有重叠
function isOverlap(periods) {
  const parsedPeriods = periods.map(period => ({
    start: parseTimeOne(period.start),
    end: parseTimeOne(period.end)
  }))
  parsedPeriods.sort((a, b) => a.start - b.start)

  for (let i = 0; i < parsedPeriods.length - 1; i++) {
    if (parsedPeriods[i].end > parsedPeriods[i + 1].start) {
      return true // 有重叠
    }
  }
  return false
}