Как искать совпадения во времени - JavaScript и момент - PullRequest
0 голосов
/ 05 ноября 2018

Я создаю календарь, в который я добавляю события за день в массив

Отметка времени для startTime и endTime сохраняется в формате String. Пример событий за день

const events = [{
    "_id": "5bdf91a78197f0ced6c03496",
    "user": "5bd62237d62cc34a29e93c46",
    "firstName": "John",
    "lastName": "Doe",
    "date": "2018-11-04",
    "startTime": "16:00",
    "endTime": "17:00",
    "__v": 0
  },
  {
    "_id": "5bdf91ec8197f0ced6c03497",
    "patient": "5bd62237d62cc34a29e93c46",
    "firstName": "Punith",
    "lastName": "Ch",
    "date": "2018-11-04",
    "startTime": "17:00",
    "endTime": "18:00",
    "__v": 0
  },
  {
    "_id": "5bdf91ec8197f0ced6c03498",
    "patient": "5bd62237d62cc34a29e93c46",
    "firstName": "Punith",
    "lastName": "Ch",
    "date": "2018-11-04",
    "startTime": "06:00",
    "endTime": "07:00",
    "__v": 0
  }
]

Когда пользователь делает новый запрос на создание, мне нужно проверить, не перекрывается ли он с каким-либо из текущих событий

Опубликовать данные

{
  "patient": "5bd62237d62cc34a29e93c46",
  "firstName": "Punith",
  "lastName": "Ch",
  "date": "2018-11-04",
  "startTime": "15:00",
  "endTime": "16:21",
  "__v": 0
}

Мне нравится выдавать сообщение об ошибке, если оно перекрывается Библиотека используется, lodash

Мой код выглядит как показано ниже

router.post('/', (req, res) => {
      const events = axios.get('/getEvents?date=2018-11-04') // gets array of appointments

      //const event to be added 
      const eventToBeAdded = req.body

      //need to have logic here to check the overlapping
      function checkoverlap(events, eventToBeAdded) return true or false

      if (false) {
        res.status(422).json('Event overlaps with other')
        }
        res.status(201).json('created')
      })

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Вы можете использовать moment (). IsBetween .

В моем понимании это будет такой цикл:

checkoverlap = (events, eventToBeAdded) =>{
  events.forEach(oldEvent => {
  if(moment(eventToBeAdded.startTime).isBetween(oldEvent.startTime, oldEvent.endTime) 
  || moment(eventToBeAdded.endTime).isBetween(oldEvent.startTime, oldEvent.endTime))
    return true;
  })
return false;
}
0 голосов
/ 05 ноября 2018

Можно отсортировать startTime и endTime, выполнить итерацию по отсортированному списку и проверить, больше ли endTime текущего массива, чем startTime следующего.

const events = [{
        "_id": "5bdf91a78197f0ced6c03496",
        "user": "5bd62237d62cc34a29e93c46",
        "firstName": "John",
        "lastName": "Doe",
        "date": "2018-11-04",
        "startTime": "12:00",
        "endTime": "14:00",
        "__v": 0
    },
    {
        "_id": "5bdf91ec8197f0ced6c03497",
        "patient": "5bd62237d62cc34a29e93c46",
        "firstName": "Punith",
        "lastName": "Ch",
        "date": "2018-11-04",
        "startTime": "17:00",
        "endTime": "18:00",
        "__v": 0
    },
    {
        "_id": "5bdf91ec8197f0ced6c03498",
        "patient": "5bd62237d62cc34a29e93c46",
        "firstName": "Punith",
        "lastName": "Ch",
        "date": "2018-11-04",
        "startTime": "15:00",
        "endTime": "20:00",
        "__v": 0
    }
];

function checkOverlap(timeStart, timeEnd) {
    const data = events;
    let start = [];
    data.forEach((e) => {
        let d = [e.startTime, e.endTime];
        start.push(d);
    });
    // sorted the time
    start.sort();
    start.forEach((e, i) => {
        if (start[i + 1]) {
            if (e[1] > start[i + 1][0]) {
              console.log(e.join(' ') + " overlap");
            }
        }
    });
}

checkOverlap();
0 голосов
/ 05 ноября 2018

Что я хотел бы сделать, это проверить, находится ли начало или конец eventToBeAdded между началом и концом одного из событий. Вы можете проверить это, сравнив отметку времени.

function checkoverlap(events, eventToBeAdded) {
    var addedStart = new Date(eventToBeAdded.date + " " + eventToBeAdded.startTime).getTime();
    var addedEnd = new Date(eventToBeAdded.date + " " + eventToBeAdded.endTime).getTime();

    for (var i=0; i<events.length; i++) {
        var eventStart = new Date(events[i].date + " " + events[i].startTime).getTime();
        var eventEnd = new Date(events[i].date + " " + events[i].endTime).getTime();

        if ((addedStart > eventStart && addedStart < eventEnd) || (addedEnd > eventStart && addedEnd < eventEnd)) {
            return true;
        }
    }
    return false;
}
...