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