【问题标题】:Javascript - Looping Through An Array Of Appointments, Finding Next AvailableJavascript - 遍历一系列约会,寻找下一个可用的
【发布时间】:2020-10-01 16:24:10
【问题描述】:

给定x 天数,我正在尝试遍历一组约会(这些对象包含startDateendDate)并找到x 天没有安排约会的最快事件(@ 987654324@)。尝试使用时刻,但我不确定它是否是正确的(或最优雅的)路线。注意:我不只是解决所有约会后的第一个开放日,因为现有约会之间可能有开放日

import Moment from 'moment';
import { extendMoment } from 'moment-range';

const moment = extendMoment(Moment);

const determineStartDate = (daysNeeded, existingAppts) => {
  // this is about as far as I've gotten...
  pendingStartDate = moment();
  existingAppts.forEach((a) => {
    range = moment.range(moment(a.startDate), moment(a.endDate);
    console.log(range.contains(pendingStartDate));
  })

}

// just some dummy code to help explain
const daysNeeded = 2
const existingAppts = [
  { startDate: '2020-06-15', endDate: '2020-06-17' },
  { startDate: '2020-06-14', endDate: '2020-06-14' },
]
const pendingStartDate = determineStartDate(daysNeeded, existingAppts);

【问题讨论】:

    标签: javascript reactjs momentjs scheduling date-range


    【解决方案1】:

    如果您不想这样做,则无需为此使用时刻.. 可以使用 javascript Date()。

    existingAppts.sort(function(a, b) {
      var aDate = new Date(a.endDate);
      var bDate = new Date(b.endDate);
      return (aDate - bDate);
    });
    
    daysNeeded = (daysNeeded > 0) ? daysNeeded - 1 : 0; 
    var apptFound = false;
    var apptStart;
    var apptEnd;
    for(var index = 0; index < (existingAppts.length - 1) && !apptFound; index++){
      apptStart = new Date(existingAppts[index].endDate);
      apptStart.setDate(apptStart.getDate() + 1);
    
      apptEnd = newDate();
      apptEnd.setDate(apptStart.getDate() + daysNeeded);
    
      var nextStart = newDate(existingAppts[index + 1].startDate);
      if(apptEnd < nextStart){
        apptFound = true;
      }
    }
    if(!apptFound){
      apptStart = newDate(existingAppts[existingAppts.length - 1].endDate);
      apptStart.setDate(apptStart.getDate() + 1);
      apptEnd = newDate();
      apptEnd.setDate(apptStart.getDate() + daysNeeded);
    }
    existingAppts.push({startDate: apptStart, endDate: apptEnd});
    

    在您的确定开始日期函数中,首先按结束日期对现有约会进行排序。然后遍历您的约会......新约会的潜在开始日期是当前约会结束后的第二天。计算潜在的结束日期并与列表中下一个约会的开始日期进行比较。如果有空间,则退出循环并将新约会设置到数组中。如果在没有找到足够大的空位的情况下退出循环,则将约会安排在最后一次约会之后的第二天(或您的客户希望的任何时间)。

    【讨论】:

    • 我想我的问题可能不是很清楚,他们有可能在预定的约会之间有开放日,我正在努力解决这个问题
    • cool beans.. 我确实误读了您的问题...我编辑了答案以反映您的需要...根据需要适应您的特定代码...
    【解决方案2】:
    function determineStartDate(daysNeeded, existingAppts) { 
      // sort your existing appointments
      const sortedAppointments = existingAppts.sort(function(a, b) {
        var aDate = new Date(a.endDate);
        var bDate = new Date(b.endDate);
        return (aDate - bDate);
      });
    
      // potentialStartDate, start from today
      let pStartDateInUTC = Date.now()
      for (let appointment of sortedAppointments) {
        const aStartDate = new Date(appointment['startDate'])
        const aEndDate = new Date(appointment['endDate'])
    
        // calculate potentialEndDate
        let pEndDate = new Date(pStartDateInUTC + (daysNeeded-1) * 24 * 60 * 60 * 1000)
    
        // if potentialEndDate is before the startDate 
        // of the current appointment,
        // it is a valid solution
        if (pEndDate < aStartDate) {
            // match found!
            break
        }
    
        // else, reset potential start date to 
        // day after current appointment's end date
        pStartDateInUTC = (new Date()).setDate(aEndDate.getDate() + 1)
      }
    
      return new Date(pStartDateInUTC)
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 2011-02-19
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 2016-03-22
      • 1970-01-01
      相关资源
      最近更新 更多