功能
传入多个不想交的时间段(开始、结束时间)及新加入的开始、结束时间,判断新加入的时间与现有的时间是否有交集。数据的校验应该在上层就已经完成,默认进入这里的数据都是合法的,比如不会出现结束时间早于开始时间的情况。
/**
* 构造checkTimesIsIntersect用时间对象
* @param time 传入的时间
* @param label 时间标签 start/end
* @returns {{time: *, label: *}}
*/
function constructTimeObj(time, label) {
return {time, label};
}
/**
* 校验新增时间段是否和现有时间段有交集
* @param {Object[]} timeInfos 时间数组对象
* @param {Number} timeInfos.startTime 开始时间
* @param {Number} timeInfos.endTime 结束时间
* @param {Number} startTime 新加入开始时间
* @param {Number} endTime 新加入结束时间
*/
function checkTimesIsIntersect(timeInfos, startTime, endTime) {
const timeObjs = [
constructTimeObj(startTime, 'start'),
constructTimeObj(endTime, 'end'),
];
_.forEach(timeInfos, (v) => {
timeObjs.push(constructTimeObj(v.startTime, 'start'));
timeObjs.push(constructTimeObj(v.endTime, 'end'));
});
// 升序
const orderedTimeObjs = timeObjs.sort((a, b) => {
return a.time - b.time;
});
_.forEach(orderedTimeObjs, (v, k) => {
// 最后一个元素不做判断
if (orderedTimeObjs.length === k + 1) {
return;
}
// 判断相邻时间秒数是否相同
if (parseInt(v.time / 1000, 10) === parseInt(orderedTimeObjs[k + 1].time / 1000, 10)) {
// throw new MError(MError.GROUPCOMMODITY_TIME_CONFLICT);
}
// 判断相邻标签是否相同
if (v.label === orderedTimeObjs[k + 1].label) {
// throw new MError(MError.GROUPCOMMODITY_TIME_CONFLICT);
}
});
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于