Esta es la estructura de mi base de datos:
[ { "schedule_time": "2021-05-17 12:39:29", "slot": "L", "item_date": "2021-05-18" }, { "schedule_time": "2021-05-17 12:47:53", "slot": "D", "item_date": "2021-05-18" }, { "schedule_time": "2021-05-18 13:55:22", "slot": "D", "item_date": "2021-05-19" }, { "schedule_time": "2021-05-19 16:09:15", "slot": "L", "item_date": "2021-05-20" }, { "schedule_time": "2021-05-19 16:11:55", "slot": "L", "item_date": "2021-05-20" },
Quiero crear una función que tomará item_date y mostrará cuántos horarios hay entre las 9 am y las 12 am. 12h a 15h, 15h a 18h, 18h a 21h los días anteriores. si observa la base de datos, item_date y schedule_date no son lo mismo. Es por eso que quiero que los horarios del día anterior se enumeren en una matriz.
Creé una función que solo devuelve datos de 9 am a 12 am. Quiero los horarios juntos en una matriz.
function schedulesList (date){ let dbItemDate = date; let otherDayArray = schedules.filter(num => num.item_date !== dbItemDate); // not equal because I want other dates schedules not the exact date let times = otherDayArray?.filter(num => num.schedule_time.split(' ')[1] >= '12:00:00' && num.schedule_time.split(' ')[1] <= '14:00:00'); console.log('9am to 12pm', times.length, 'schedules') // }
El resultado esperado debe ser similar a este:
[ '9am to 12pm' : 2, '12pm to 3pm' : 0, '3pm to 6pm' : 1, '6pm to 9pm' : 3, ]
Suponiendo que haya almacenado la matriz de entrada dada en una variable llamada data
.
let data = [{ "schedule_time": "2021-05-17 12:39:29", "slot": "L", "item_date": "2021-05-18" }, { "schedule_time": "2021-05-17 12:47:53", "slot": "D", "item_date": "2021-05-18" }, { "schedule_time": "2021-05-18 13:55:22", "slot": "D", "item_date": "2021-05-19" }, { "schedule_time": "2021-05-19 16:09:15", "slot": "L", "item_date": "2021-05-21" }, { "schedule_time": "2021-05-19 16:11:55", "slot": "L", "item_date": "2021-05-20" } ]; //function to get the final results let getScheduleCounter = (date) => { let scheduleCounter = { '9_12': [], '12_3': [], '3_6': [], '6_9': [] }; data.forEach(sch => { if (sch.item_date !== date) { updateScheduledCounter(sch, scheduleCounter); } }); return scheduleCounter; } //function to get the count and update in scheduleCounter let updateScheduledCounter = (sch, scheduleCounter) => { let time = sch.schedule_time.split(' ')[1]; switch (!!time) { case (time <= '12:00:00'): scheduleCounter['9_12']++; break; case (time >= '12:00:00' && time <= '15:00:00'): scheduleCounter['12_3']++; break; case (time >= '15:00:00' && time <= '18:00:00'): scheduleCounter['3_6']++; break; case (time >= '18:00:00' && time <= '21:00:00'): scheduleCounter['6_9']++; break; } } let schedules = getScheduleCounter("2021-05-20"); console.log('schedules: ', schedules);
Sugiero el siguiente enfoque para la solución.
const schedules = [ {"schedule_time": "2021-05-17 12:39:29","slot": "L","item_date": "2021-05-18"}, {"schedule_time": "2021-05-17 12:47:53","slot": "D","item_date": "2021-05-18"}, {"schedule_time": "2021-05-18 13:55:22","slot": "D","item_date": "2021-05-19"}, {"schedule_time": "2021-05-19 16:09:15","slot": "L","item_date": "2021-05-20"}, {"schedule_time": "2021-05-19 16:11:55","slot": "L","item_date": "2021-05-20"}]; const hours = [ {hoursName: '9am to 12pm', from: 9, to: 12}, {hoursName: '12pm to 3pm', from: 12, to: 15}, {hoursName: '3pm to 6pm', from: 15, to: 18}, {hoursName: '6pm to 9pm', from: 18, to: 21}]; const targetDate = new Date("2021-05-20"); const previousItems = schedules.filter(({ schedule_time }) => { const scheduleTime = new Date(schedule_time); return scheduleTime < targetDate; }); const result = previousItems.reduce((acc, { schedule_time }) => { const scheduleTime = new Date(schedule_time); const targetHour = scheduleTime.getHours(); const { hoursName } = hours.find(({ from, to }) => (targetHour >= from) && (targetHour < to)); acc[hoursName] = (acc[hoursName] ?? 0) + 1; return acc; }, {}); console.log(result);
.as-console-wrapper{min-height: 100%!important; top: 0}