我有一个注册了不同时间的数组
const existing = [
{
start: "2020-02-05T09:00:00Z",
end: "2020-02-05T10:15:00Z"
},
{
start: "2020-02-05T10:30:00Z",
end: "2020-02-05T11:00:00Z"
},
{
start: "2020-02-05T11:00:00Z",
end: "2020-02-05T12:15:00Z"
}
]
我希望一个可以返回true或false的函数,如果可以再添加一次。
如果已注册10:00-11:00,则还可以添加09:00-10:00。这意味着开始时间和结束时间可以重叠。
用户可能会尝试添加这些时间。但是出于某种原因,他们可以选择其他多个小时
例如newStart 09:59 - newEnd 10:20
例如newStart 10:16 - newEnd 10:29
问题是比较不同的对象,还要比较不同对象之间的时间。任何想法
看起来像Array.prototype.every()
可能有助于遍历保留的时隙数组,以找出那些是否不与请求的时隙重叠:
Array.prototype.every()
const reserved = [{start:"2020-02-05T09:00:00Z",end:"2020-02-05T10:15:00Z"},{start:"2020-02-05T10:30:00Z",end:"2020-02-05T11:00:00Z"},{start:"2020-02-05T11:00:00Z",end:"2020-02-05T12:15:00Z"}],
bookingTimeInvalid = {start: '2020-02-05T09:59:00Z', end: '2020-02-05T10:20:00Z' },
bookingTimeValid = {start: '2020-02-05T10:16:00Z', end: '2020-02-05T10:29:00Z' },
validateBookingTime = ({start,end}, reserve) =>
reserve.every(reserve =>
new Date(reserve.start) >= new Date(end) ||
new Date(reserve.end) <= new Date(start)
)
console.log(`is 09:59-10:20 available? : `,validateBookingTime(bookingTimeInvalid, reserved))
console.log(`is 10:16-10:29 available? : `,validateBookingTime(bookingTimeValid, reserved))
您可以创建一个合并所有重叠时间的合并时间表。
在随后的步骤中,您可以再次比较所需时间和结束时间。
.as-console-wrapper {min-height:100%}
const
existing = [
{ start: "2020-02-05T09:00:00Z", end: "2020-02-05T10:15:00Z" },
{ start: "2020-02-05T09:00:00Z", end: "2020-02-05T09:08:00Z" },
{ start: "2020-02-05T10:30:00Z", end: "2020-02-05T11:00:00Z" },
{ start: "2020-02-05T11:00:00Z", end: "2020-02-05T12:15:00Z" }
],
result = existing
.reduce((r, { start, end }) => [...r, [start, true], [end, false]], [])
.sort((a, b) => a[0] > b[0] || -(a[0] < b[0]) || b[1] - a[1])
.reduce((count => (r, [time, isStart]) => {
if (!count) r.push({ start: time });
count += isStart || -1;
if (!count) r[r.length - 1].end = time;
return r;
})(0), []);
console.log(result);