我可以检查时间范围内的空闲时间

问题描述 投票:0回答:2

我有一个注册了不同时间的数组

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

问题是比较不同的对象,还要比较不同对象之间的时间。任何想法

javascript time range
2个回答
1
投票

看起来像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))

0
投票

您可以创建一个合并所有重叠时间的合并时间表。

在随后的步骤中,您可以再次比较所需时间和结束时间。

.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);
© www.soinside.com 2019 - 2024. All rights reserved.