需求: 餐饮类营业时间,创建多组带星期的时间段,且同一星期不能出现重叠时间段,在保存时间段时就要进行判断。
要达到的效果(微盟的餐饮设置):
基本的思路也是用开始时间和结束时间进行比较。把当天的开始时间,结束时间分别存进两个数组,sort排序,循环遍历,从开始时间的第二个元素去比较结束时间的第一个元素,如果小于,就代表时间段有交叉,直接跳出,不然就继续遍历,遍历结束,说明时间没有重复,可以保存
实现:
//星期格式如下
weekDate: [
{ id: '0', label: '周日' },
{ id: '1', label: '周一' },
{ id: '2', label: '周二' },
{ id: '3', label: '周三' },
{ id: '4', label: '周四' },
{ id: '5', label: '周五' },
{ id: '6', label: '周六' }, ],
//item为新创建的一组时间段
submit (item) {
let len = this.requestParams
//首先循环星期,让每一天的数据单独验证
for (let x = 0; x < this.weekDate.length; x++) {
let startTimeArr = []
let endTimeArr = []
let timeStrat = ''
let timeEnd = ''
//再循环已有的几组数据
for (let i = 0; i < len.length; i++) {
//第三次循环某组数据下有几个时间段
for (let a = 0; a < len[i].time_ranges.length; a++) {
//最后循环某时间段下选择了几个星期
for (let y = 0; y < len[i].time_ranges[a].weeks.length; y++) {
//若选择的星期在该次星期循环中,则push到判断数组
if (len[i].time_ranges[a].weeks[y] === this.weekDate[x].id) {
timeStrat = len[i].time_ranges[a].start_time
timeEnd = len[i].time_ranges[a].end_time
startTimeArr.push(timeStrat)
endTimeArr.push(timeEnd)
}
}
}
}
//将创建的时间段再添加到上面的数组中
for (let j = 0; j < item.time_ranges.length; j++) {
for (let z = 0; z < item.time_ranges[j].weeks.length; z++) {
if (item.time_ranges[j].weeks[z] === this.weekDate[x].id) {
timeStrat = item.time_ranges[j].start_time
timeEnd = item.time_ranges[j].end_time
startTimeArr.push(timeStrat)
endTimeArr.push(timeEnd)
}
}
}
//进行sort排序
let begin = startTimeArr.sort()
let over = endTimeArr.sort()
for (var k = 1; k < begin.length; k++) {
if (begin[k] <= over[k - 1]) {
this.$message.error("时间段存在重叠!")
throw "时间段存在重叠!"
}
}
}