表單裏要提交多段時間,要檢驗每段時間不能有互相重合的時間段
- 多段時間原始格式以下(時、分、秒轉化爲秒,或者時間戳):
var timeArray = [
{start:"27890",off:"28790"},
{start:"25530",off:"25556"},
{start:"27000",off:"31589"},
{start:"25550",off:"25560"},
]
一、數組比較法
一、將多段時間的開始時間和結束時間分別組成兩個數組
var minTimes = []
var maxTimes = []
timeArray.map((v)=>{
minTimes.push(v.start) //多段開始時間的數組 minTimes = ["27890", "25530", "27000", "25550"]
})
timeArray.map((v)=>{
maxTimes.push(v.off) //多段結束時間的數組 maxTimes = ["28790", "25556", "31589", "25560"]
})
二、將minTimes和maxTimes數組元素分別從大到小排序
minTimes.sort() // minTimes = ["25530", "25550", "27000", "27890"]
maxTimes.sort() // maxTimes = ["25556", "25560", "28790", "31589"]
三、比較maxTimes[index]和minTimes[index+1],即看結束時間是否永遠比開始時間小
- 從index=1開始比較,若是maxTimes[index]的值比minTimes[index+1]小,說明時間段不會重合,以此類推比較,若是沒有出現maxTimes[index] > minTimes[inex+1]的狀況,則沒有時間段發生重合,若是存在一次maxTimes[index] > minTimes[inex+1],則時間段重合
二、對象比較法
一、timeArray的每一項按開始時間從小到大排序
var temp
for(var i = 0; i < timeArray.length - 1; i++) {
for(var j = i + 1; j < timeArray.length; j++){
if(timeArray[i].start > timeArray[j].start){
temp = timeArray[i]
timeArray[i] = timeArray[j]
timeArray[j] = temp
}
}
} //timeArray = [
// {start: "25530", off: "25556"},
// {start: "25550", off: "25560"},
// {start: "27000", off: "31589"},
// {start: "27890", off: "28790"}
// ]
二、前一段的結束時間與後一段的結束時間比較,若後一段的結束時間永遠小於前一段的開始時間,則時間算段沒有衝突
for(var i = 0;i<timeArray.length-1;i++){
if(timeArray[i].off<timeArray[i+1].start){
console.log('success')
} else {
console.log(`the ${i+1} and ${i+2} rang is conflicting`)
}
}
總結
- 第一種方法是將時間段都拆分了,至關於將多段時間從小到大重新排序,可是沒有很嚴謹的邏輯證實這種方法是正確的,但暫時也想不出這種方法存在錯誤的反例
- 第二種方法至關於把時間段按照開始時間重新排序,時間段並無被拆分,若是時間段不衝突,那麼確定有每一段的前一段結束時間小於當前段的開始時間,反之,若是當,每一段當前段的開始時間都小於前一段的結束時間,則時間段不衝突,是充分必要條件,因此我以爲第二種方法有較嚴謹的邏輯性,可採用。
- 以上兩種方法的前提是,保證每一段的結束時間都要比開始時間大