Entonces, lo que básicamente estoy tratando de hacer es consultar una lista de programas disponibles para un período de una semana. Lo formateo en un objeto para cuando selecciono un solo día, puedo usar fácilmente la búsqueda de objetos para ese día y crear programsOnSelectedDay en el día seleccionado.
programDateLookUp { "22/04/24": [ { "programType": "CLINIC", "start_date": "2022-04-24T16:00:00.000Z" } ], "22/04/25": [ { "programType": "PRACTICE", "start_date": "2022-04-25T16:00:00.000Z" }, { "programType": "PICKUP", "start_date": "2022-04-25T16:00:00.000Z" } ], "22/04/27": [ { "programType": "PRACTICE", "start_date": "2022-04-27T16:00:00.000Z" } ], "22/04/28": [ { "programType": "CLINIC", "start_date": "2022-04-28T16:00:00.000Z" } ] } Luego tomo los programsOnSelectedDay en el día seleccionado en función de las claves de objeto de esta manera
const programsOnSelectedDay = programDateLookUp[selectedDay] || []; where selectedDay = '22/04/25' LOG programsOnSelectedDay [ { "programType": "PRACTICE", "start_date": "2022-04-25T16:00:00.000Z" }, { "programType": "PICKUP", "start_date": "2022-04-25T16:00:00.000Z" } ] Ahora necesito una función recursiva, creo que para poder verificar la duración de los programsOnSelectedDay el día seleccionado, ver que sea menos de 10 y agregar los programas del día siguiente a esa matriz de programsOnSelectedDay en el día seleccionado, y así sucesivamente hasta que alcance al menos 10 resultados o tengo recorrido por los días restantes de la semana.
Tal como está, tengo algo como esto que simplemente alcanzará la profundidad máxima excedida
const addProgramsBasedOnLength = (programs) => { if (programs.length === 0) return programs; if (programs.length < 10) { const nextDay = moment(selectedDate, FORMAT).add(1, 'days').format(FORMAT); const nextDayPrograms = programDateLookUp[nextDay] || []; return addProgramsBasedOnLength([...programs, ...nextDayPrograms]); } return programs; }; Si solo devuelvo [...programs,...nextDayPrograms] en lugar de la función que llama a esa nueva matriz, funciona para darme solo los resultados del día siguiente. Entonces, me pregunto cómo hacer que esto sea recursivo para que me proporcione hasta 10 resultados agregados a los programsOnSelectedDay originales en el día seleccionado O hasta que haya pasado el resto de la semana.
Cualquier sabe de una manera de lograr esto?
Intenté algo muy similar al comentario de @Ouroborus.
En su lugar, recorrer la matriz de semanas que tenía fechas formateadas para la semana seleccionada actual; usando el índice de cualquier fecha que ya haya seleccionado.
La solución a continuación permite agregar solo los días de la semana posteriores a la fecha seleccionada y no recorrer los días anteriores a mi fecha seleccionada.
const addProgramsBasedOnLength = (programs, programDateLookUp, selectedDate, week) => { if (programs.length >= 10) return programs; const indexOfSelectedDate = week.findIndex(day => day.formatted === selectedDate); const restOfWeekPrograms = week.slice(indexOfSelectedDate + 1).reduce((acc, { formatted }) => [ ...acc, ...programDateLookUp[formatted] || [], ], []); return [...programs, { key: 'noMoreResultsForDay' }, ...restOfWeekPrograms]; };Agregué el objeto clave allí para propósitos de UI cuando mapeo a través de la matriz devuelta.