SOURCE

class Timer {
    constructor () {
        this.durations = []
    }

  pushDuration (duration) {
    if (!this.durations.length) return this.durations.push(duration)
    let [start, end] = duration
    // 处理时间段,有交集合并,无交集插入有序位置
    for (let i = this.durations.length - 1; i >= 0; i--) {
      const [curStart, curEnd] = this.durations[i]
      // 无交集,并且duration应该在i之前
      if (curStart > end) {
        if (i > 0) continue
        this.durations.splice(0, 0, duration)
        break
      }
      // 无交集,duraiton在i之后
      if (curEnd < start) {
        this.durations.splice(i + 1, 0, duration)
        break
      }
      // 有交集,duration被包含
      if (curStart <= start && curEnd >= end) break
      if (curStart > start && curEnd < end) {
        this.durations.splice(i, 1)
        continue
      }
      // 有交集,duration前半部分与i后半部分重合
      if (curStart <= start) {
        this.durations[i][1] = end
        break
      }
      // 有交集,duration后半部分与i前半部分重合, 合并
      if (i > 0) {
        end = curEnd
        duration = [start, end]
        this.durations.splice(i, 1)
      } else {
        this.durations[i][0] = start
      }
    }
  }
}

const timer = new Timer()
timer.pushDuration([5, 6])
timer.pushDuration([4, 6])
timer.pushDuration([8, 9])
timer.pushDuration([7, 8.5])
timer.pushDuration([8.5, 11])
timer.pushDuration([1, 3])
timer.pushDuration([1, 9])
console.log(JSON.stringify(timer.durations))
console 命令行工具 X clear

                    
>
console