js判断多个时间段是否重叠(非嵌套循环)

考虑到性能问题,未采用嵌套循环判断的方式。主要思想是:对每组时间进行标记,然后转换为时间戳后排序,排序后的数组,步长为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;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/PGD_607/article/details/106769371