Tengo el valor del día de la semana (0-6 para Sun-Sat)... ¿cómo obtengo una matriz de días (a partir del domingo para la semana dada?
Esto es lo que estoy tratando de hacer:
Un usuario hace clic en un día (es decir, 10 de mayo) y genera una matriz de fechas para la semana actual:
function selectWeek(date) { selectedWeek = []; let d = new Date(date.key); console.log(d); console.log(date.weekday, 'weekday'); console.log(date); for (let i = 0; i < date.weekday; i++) { console.log(i, 'pre'); let currD = d.setDate(d.getDate() - i).toString(); console.log(currD); selectedWeek.push(currD); } for (let i = date.weekday; i < 7; i++) { console.log(i, 'post'); selectedWeek.push(d.setDate(d.getDate() + i).toString()); } console.log(selectedWeek); }Necesito objetos de fecha de domingo a sábado.
No estoy usando una biblioteca de fechas, así que prefiero las soluciones javascript de vainilla.
Cree una matriz con 7 elementos, reste el día de la semana y agregue el índice como día:
function selectWeek(date) { return Array(7).fill(new Date(date)).map((el, idx) => new Date(el.setDate(el.getDate() - el.getDay() + idx))) } const date = new Date(); console.log(selectWeek(date));Estoy usando
fill(new Date(date))para crear una copia y no modificar el argumento. Puedes obtener los días de un mes con el mismo concepto:
function selectMonth(date) { return Array(31).fill(new Date(date)).map((el, idx) => new Date(el.setDate(1 + idx))).filter(el => el.getMonth() === date.getMonth()); } const date = new Date(); console.log(selectMonth(date));así es como yo resolvería este:
function selectWeek(date) { let selectWeek = []; for (let i=0; i<7; i++) { let weekday = new Date(date) // clone the selected date, so we don't mutate it accidentally. let selectedWeekdayIndex = date.getDay() // ie 5 for friday let selectedDay = date.getDate() // 1-31, depending on the date weekday.setDate(selectedDay - selectedWeekdayIndex + i) selectWeek = [...selectWeek, weekday] } return selectWeek; }Tomemos como ejemplo la fecha de hoy: 18.02.22. Viernes. Hacemos 6 iteraciones. En el primero obtenemos el índice de día de la semana seleccionado, que es 5 para el viernes. Clonamos la fecha y restablecemos su día (18) reduciéndolo a este número: 18-5 = 13. Este es el día del domingo. Luego vamos incrementando los días en uno para llenar el resto de la semana.
Por supuesto, se puede optimizar y escribir mucho más corto, pero traté de mostrar y explicar la lógica.
¿Revisaste los prototipos de Date antes?
Creo que Date.prototype.getDay() puede hacer lo que quieras:
function selectWeekDays(date) { var i, d = new Date(date), a = []; // console.log(d.getDay()); // Number of the day d.setDate(d.getDate() - d.getDay() - 1); // Set date one day before first day of week for (i=0; i<7; i++) { d.setDate(d.getDate() + 1); // Add one day a.push(d.valueOf()); } return a; } var result = selectWeekDays('2022-01-01') // Satureday = 6 console.log(result); result.forEach(e => console.log(new Date(e).toString()));