首页 > 解决方案 > 从 5 分钟间隔到 20 分钟间隔过滤日期数组

问题描述

我在 08:00-17:00 之间有大量用于预订申请的时段。每个时段为 5 分钟,我已删除与已预订时段重叠的所有时段。

例如,在 11:00-12:50 之间已经有一个事件,所以这个时间段不可用。

{
    "date": "2019-03-15",
    "start": "2019-03-15T09:15:00.000Z",
    "starttime": "10:15",
    "end": "2019-03-15T09:45:00.000Z",
    "endtime": "10:45"
  },
  {
    "date": "2019-03-15",
    "start": "2019-03-15T09:20:00.000Z",
    "starttime": "10:20",
    "end": "2019-03-15T09:50:00.000Z",
    "endtime": "10:50"
  },
  {
    "date": "2019-03-15",
    "start": "2019-03-15T09:25:00.000Z",
    "starttime": "10:25",
    "end": "2019-03-15T09:55:00.000Z",
    "endtime": "10:55"
  },
  {
    "date": "2019-03-15",
    "start": "2019-03-15T09:30:00.000Z",
    "starttime": "10:30",
    "end": "2019-03-15T10:00:00.000Z",
    "endtime": "11:00"
  },
  {
    "date": "2019-03-15",
    "start": "2019-03-15T11:50:00.000Z",
    "starttime": "12:50",
    "end": "2019-03-15T12:20:00.000Z",
    "endtime": "13:20"
  },

但是,在我将其返回给最终用户之前,我需要删除所有元素,因此每个插槽之间有 20 分钟的间隔。因此,我希望他们有 20 分钟的间隔,而不是每 5 分钟一次。所以结束时间必须是 10:20... 10:40... 11:00.. 所有活动都不得与已预订的活动有间隔。因此,每个插槽都必须有一个连接到现有事件的插槽。

我该怎么做?

标签: javascriptmomentjslodash

解决方案


将Json对象放入数组中,执行以下代码。

其中 search 是用于查找时间段的变量。

function toDate(dStr,format) {
    var now = new Date();
    if (format == "h:m") {
        now.setHours(dStr.substr(0,dStr.indexOf(":")));
        now.setMinutes(dStr.substr(dStr.indexOf(":")+1));
        now.setSeconds(0);
        return now;
    }else 
        return "Invalid Format";
}

let serach="13:10";
let value = sample.filter((val) => {
    if( (toDate(val.endtime,"h:m").toTimeString() >= toDate(serach,"h:m").toTimeString()) && (toDate(val.starttime,"h:m").toTimeString() <= toDate(serach,"h:m").toTimeString()) ){
      return val.starttime;
   }
})

value 将保存时隙与 json 中的日期匹配的数组


推荐阅读