首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript -遍历约会数组,查找下一个可用项

Javascript -遍历约会数组,查找下一个可用项
EN

Stack Overflow用户
提问于 2020-06-12 06:04:04
回答 2查看 158关注 0票数 1

给定约会天数,我尝试遍历一组约会(它们是包含startDateendDate的对象),找出最快出现的x天,但没有预约(pendingStartDate)。尝试使用moment,但我不确定这是不是正确的(或最优雅的)路线。注意:我不仅仅是解决在所有约会之后获得第一个开放日的问题,因为在现有约会之间可以有开放日。

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2020-06-12 06:42:27

如果你不想这样做,不需要使用moment ..可以使用javascript Date()。

代码语言:javascript
复制
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});

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

票数 0
EN

Stack Overflow用户

发布于 2020-06-12 21:43:34

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62334322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档