考虑到性能问题,未采用嵌套循环判断的方式。主要思想是:对每组时间进行标记,然后转换为时间戳后排序,排序后的数组,步长为2循环,如果每两个的标记不同,或者存在相同时间,则说明重叠。
// 时段数组
const data = [{
startTime: new Date("2020-6-15 00:12:00),
endTime: new Date("2020-6-15 09:12:00),
}, {
startTime: new Date("2020-6-15 06:12:00),
endTime: new Date("2020-6-15 13:12:00),
}, {
startTime: new Date("2020-6-15 10:12:00),
endTime: new Date("2020-6-15 16:12:00),
}]
// 对数组循环, 判断数据有效性;将时间转换为时间戳,并给同一时段打上相同标记, 不同时段的标记不同
let tempList = [];
let isValid = data.every((item, index) => {
// 数据无效直接中断退出
if(!item.startTime || !item.endTime) {
return false;
}
// 转换为时间戳
let startTimeStamp = item.startTime.getTime(),
endTimeStamp = item.endTime.getTime();
if(startTimeStamp >= endTimeStamp ) {
return false;
}
// 将时段数据处理后存入数组
tempList.push([
{
"flag": index,
"value": startTimeStamp ,
}, {
"flag": index,
"value": endTimeStamp ,
}
])
})
// 对数组进行扁平处理后 从小到大排序
let timeFiledList = [].concat(...tempList );
if(isValid ) {
timeFiledList.sort((a, b) => a.value - b.value);
// 是否重叠标志
let isOverLap = false;
for(let i = 0; i < timeFiledList.length; i += 2) {
if(i > 0) {
// 存在相同值时(排序中三个连续值) => 时间重叠
if(timeFiledList[i].value == timeFiledList[i - 1].value ||
timeFiledList[i - 1].value == timeFiledList[i - 2].value) {
isOverLap = true;
break;
}
}
// 相邻两个标记不同,则为重叠
if(timeFiledList[i].flag != timeFiledList[i + 1].flag) {
isOverLap = true;
break;
}
}
}