js校验多段时间不重合

26次阅读

共计 1692 个字符,预计需要花费 5 分钟才能阅读完成。

表单里要提交多段时间,要检验每段时间不能有互相重合的时间段
多段时间原始格式如下(时、分、秒转化为秒,或者时间戳):
var timeArray = [
{start:”27890″,off:”28790″},
{start:”25530″,off:”25556″},
{start:”27000″,off:”31589″},
{start:”25550″,off:”25560″},
]
1、数组比较法
1、将多段时间的开始时间和结束时间分别组成两个数组
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”]
})
2、将 minTimes 和 maxTimes 数组元素分别从大到小排序
相当于时间段从小到大重排
minTimes.sort() // minTimes =  [“25530”, “25550”, “27000”, “27890”]
maxTimes.sort() // maxTimes =  [“25556”, “25560”, “28790”, “31589”]
3、比较 maxTimes[index] 和 minTimes[index+1], 即看结束时间是否永远比开始时间小
从 index= 1 开始比较,如果 maxTimes[index] 的值比 minTimes[index+1] 小,说明时间段不会重合,以此类推比较,如果没有出现 maxTimes[index] > minTimes[inex+1] 的情况,则没有时间段发生重合,如果存在一次 maxTimes[index] > minTimes[inex+1],则时间段重合
2、对象比较法
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”}
// ]
2、前一段的结束时间与后一段的结束时间比较,若后一段的结束时间永远小于前一段的开始时间,则时间算段没有冲突
好处:能知道冲突的时间段是哪几段
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`)
}
}
总结

第一种方法是将时间段都拆分了,相当于将多段时间从小到大从新排序,但是没有很严谨的逻辑证明这种方法是正确的,但暂时也想不出这种方法存在错误的反例
第二种方法相当于把时间段按照开始时间从新排序,时间段并没有被拆分,如果时间段不冲突,那么肯定有每一段的前一段结束时间小于当前段的开始时间,反之,如果当,每一段当前段的开始时间都小于前一段的结束时间,则时间段不冲突,是充分必要条件,所以我觉得第二种方法有教严谨的逻辑性,可采用。
以上两种方法的前提是,保证每一段的结束时间都要比开始时间大

正文完
 0