Estoy tratando de crear una serie de fechas basadas en una serie de semanas.
Hay cuatro semanas con 5 días cada una, cada semana es un objeto que contiene el número de semana y una matriz de 5 días; los días son objetos que contienen el día y la fecha.
weeks[0].days[0].day devolvería el lunes, por ejemplo.
Uso LuxonJS para generar la fecha según el número de semana y el día de la semana usando la función generateDate(weekNr, dayNr) .
Para completar el valor de la date en los elementos del día de la semana, he intentado lo siguiente:
for(x = 0; x <= weeks.length; x++){ for(y = 0; y <= weeks[x].days.length; y++){ weeks[x].days[y]['date'] = generateDate(weeks[x].weekNr, y) } } Sin embargo, por alguna razón, los días de cada semana ahora se llenan con las fechas de la última semana, por lo que weeks[0].days[4].date devolvería exactamente la misma fecha que weeks[3].days[4].date . En otras palabras, aparte del número de semana, las 4 semanas se vuelven idénticas.
Si registro las fechas en el bucle for, todas aparecen correctamente, por lo que parece que se reemplazan cada vez que se repite el primer bucle for. ¿Alguien sabe lo que estoy haciendo mal?
Este comportamiento probablemente esté relacionado con la forma en que construyó la matriz de weeks original. Parece que asignó el mismo objeto a las cuatro entradas en weeks , en lugar de crear un nuevo objeto para cada entrada.
Luego, cuando ejecute ese ciclo anidado, estará mutando el mismo objeto para cada iteración del ciclo externo. Así que asegúrese de crear un nuevo objeto cada vez que asigne (o envíe) un objeto a la matriz de weeks .
Como nota al margen, así es como lo haría en JavaScript vainilla:
function getWeekDays(year, weekNr) { let dt = new Date(year, 0, 4); // 4 January is always in week #1 // Get Sunday before the start of the week dt.setDate(dt.getDate() - (dt.getDay() || 7) - 7 + weekNr * 7); return { weekNr, days: Array.from({length: 5}, () => { dt.setDate(dt.getDate() + 1); // Increment date return { day: dt.toLocaleDateString("en", { weekday: 'long'}), date: dt.toLocaleDateString("en-SE") }; }) }; } function getMonthDays(year, firstWeek, numWeeks) { return Array.from({length: numWeeks}, () => getWeekDays(year, firstWeek++)); } // Example creation of the weeks array let weeks = getMonthDays(2022, 9, 4); console.log(weeks);