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;
		}
	}
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值