Select next object based on Date

Tags: , , , ,



I’m trying to Loop through an array and pull out the closest/next meeting object Chronologically.

Each object has a Start and End time but I want to know what is the current event OR the next event that’s going to happen. Failing that to get the last event.

e.g.

const meetings = [{title:"morning",startAt:new Date("2020-10-14 7:00"),
                                     endAt:new Date("2020-10-14 8:00")},
                 {title:"evening",startAt:new Date("2020-10-14 20:00"),
                                    endAt:new Date("2020-10-14 21:00")},
                 {title:"afternoon",startAt:new Date("2020-10-14 15:00"),
                                    endAt:new Date("2020-10-14 15:12")}]
// results:
"2020-10-14 01:00" // morning
"2020-10-14 07:30" // morning
"2020-10-14 08:01" // afternoon
"2020-10-14 15:00" // afternoon
"2020-10-14 15:12" // afternoon
"2020-10-14 15:13" // evening
"2020-10-14 21:00" // evening
"2020-10-14 23:59" // evening

This is what i have so far:

const targetDate = new Date("2020-10-14 15:12")

meetings.reduce((found,meeting)=>{
           if( ! found){
                return meeting
           } else if( meeting.startAt > targetDate
                   &&( found.startAt < targetDate
                   ||  meeting.startAt < found.startAt)){
                 return meeting
           }
           return found
      },{}))

Answer

Try this function getMeeting(meetings,targetDate)

You can pass the set of meetings + a target Date/defaults to now

const testSet = [
                [new Date("2020-10-14 01:00"),"morning"],
                [new Date("2020-10-14 07:30"),"morning"],
                [new Date("2020-10-14 08:01"),"afternoon"],
                [new Date("2020-10-14 15:00"),"afternoon"],
                [new Date("2020-10-14 15:12"),"afternoon"],
                [new Date("2020-10-14 15:13"),"evening"],
                [new Date("2020-10-14 21:00"),"night"],
                [new Date("2020-10-14 23:59"),"night"],
              ]
              
    const meetings = [
      { title: "morning", startAt: new Date("2020-10-14 7:00"), endAt: new Date("2020-10-14 8:00") },
      { title: "evening", startAt: new Date("2020-10-14 20:00"), endAt: new Date("2020-10-14 20:59") },
      { title: "afternoon", startAt: new Date("2020-10-14 15:00"), endAt: new Date("2020-10-14 15:12") },
      { title: "night",  startAt: new Date("2020-10-14 21:00"),  endAt: new Date("2020-10-14 23:15") },
    ];

    
function getMeeting(meetings, targetDate = new Date()){

return meetings.sort((a,b)=>b.startAt - a.startAt)
                            .reduce((closest, meeting) => {
     
        if ( ! closest) {
          closest = meeting;
        } else if (closest.startAt <= targetDate 
               &&  closest.endAt >= targetDate) {
          // KEEP closest
        } else if (meeting.startAt <= targetDate 
               &&  meeting.endAt >= targetDate) {
          closest = meeting;
        } else if (meeting.startAt <= targetDate 
               &&  closest.startAt <= meeting.startAt) {
          closest = meeting;
        } else if (meeting.endAt >= targetDate 
               &&  closest.endAt >= meeting.endAt) {
          closest = meeting;
        }
      
      return closest;
    }, null);
}

testSet.forEach(([date,name])=>{
    console.log(name === getMeeting(meetings,date).title ? "✔" : "✘", date)
})


Source: stackoverflow