我需要比较日程表是否有重叠,可以是2个到无限个日程表。
例如,一个包含3个日程表的数组如下所示:
var dateRanges = [
{
DaysOfWeek: ['Sun', 'Mon'],
StartTime: "01:00",
StopTime: "17:00",
AllDay: false
},
{
DaysOfWeek: ['Tues', 'Wed'],
StartTime: "12:00",
StopTime: "21:59",
AllDay: true
},
{
DaysOfWeek: ['Thur', 'Sun'],
StartTime: "12:00",
StopTime: "21:59",
AllDay: true
}
]
我正在努力想方设法比较所有数组。目前我有以下代码:
checkScheduleForOverlap: function (dateRanges) {
var result = dateRanges.reduce((result, current, i, arr) => {
// console.log(previous, current);
// get the previous range
if (i === 0) { return result; }
var previous = arr[i - 1];
// Schedule1
var startTime1 = new Date('1970-01-01T' + previous.StartTime + 'Z');
var stopTime1 = new Date('1970-01-01T' + previous.StopTime + 'Z');
// Schedule2
var startTime2 = new Date('1970-01-01T' + current.StartTime + 'Z');
var stopTime2 = new Date('1970-01-01T' + current.StopTime + 'Z');
previous.DaysOfWeek.forEach(function (prevDay) {
console.log(prevDay);
current.DaysOfWeek.forEach(function (currDay) {
console.log(currDay);
if (prevDay === currDay) {
var overlap = (startTime1 <= stopTime2) && (stopTime1 >= startTime2);
// store the result
if (overlap) {
// yes, there is overlap
result.overlap = true;
// store the specific ranges that overlap
result.days.push(currDay);
}
}
});
});
return result;
// seed the reduce
}, { overlap: false, days: [] });
// return the final results
console.log(result);
return result;
}
但是它只比较第二个数组与第一个数组,以及第三个数组与第二个数组。 它还需要将第三个数组与第一个数组进行比较。(如果有4个时间表,则每个时间表都需要相互比较。)
我这样做是否正确?还有什么可以做到使每个“DaysOfWeek”时间表比较“StartTime”和“StopTime”与其他时间表的值?
我使用静态日期创建了一个虚假的日期对象,并且只比较时间值。
如果这不是一种有效的方法,我也可以用完全不同的方式来处理它。
moment-range
库:https://github.com/rotaready/moment-range/blob/master/README.md - CertainPerformance