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 },{}))
Advertisement
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) })