Estoy usando Moment.js para hacer un Calendario de Recursos y necesito una matriz de fechas para esta semana. El registro de la consola de mi actual función imprime correctamente, pero la matriz en la que se inserta en cada fecha está mal.

    var startOfWeek = moment().startOf('week');
    var endOfWeek = moment().endOf('week');

    var days = [];
    var day = startOfWeek;

    do {
        console.log(day._d);
        days.push(day._d);
        day = day.add(1, 'd');
    }
    while (day <= endOfWeek);

    console.log(days);

Devuelve:

Sun Jan 18 2015 00:00:00 GMT-0500 (EST) schedule.js?320233fd69f9859ccb55248b608e15891032b17d:31
Mon Jan 19 2015 00:00:00 GMT-0500 (EST) schedule.js?320233fd69f9859ccb55248b608e15891032b17d:31
Tue Jan 20 2015 00:00:00 GMT-0500 (EST) schedule.js?320233fd69f9859ccb55248b608e15891032b17d:31
Wed Jan 21 2015 00:00:00 GMT-0500 (EST) schedule.js?320233fd69f9859ccb55248b608e15891032b17d:31
Thu Jan 22 2015 00:00:00 GMT-0500 (EST) schedule.js?320233fd69f9859ccb55248b608e15891032b17d:31
Fri Jan 23 2015 00:00:00 GMT-0500 (EST) schedule.js?320233fd69f9859ccb55248b608e15891032b17d:31
Sat Jan 24 2015 00:00:00 GMT-0500 (EST) schedule.js?320233fd69f9859ccb55248b608e15891032b17d:31
[Sun Jan 25 2015 00:00:00 GMT-0500 (EST), Sun Jan 25 2015 00:00:00 GMT-0500 (EST), Sun Jan 25 2015 00:00:00 GMT-0500 (EST), Sun Jan 25 2015 00:00:00 GMT-0500 (EST), Sun Jan 25 2015 00:00:00 GMT-0500 (EST), Sun Jan 25 2015 00:00:00 GMT-0500 (EST), Sun Jan 25 2015 00:00:00 GMT-0500 (EST)]

Cuenta de cómo la matriz en la parte inferior es la próxima fecha en la matriz repite 7 veces.

  • day.add() no devuelve un momento nuevo objeto (.add()) – es siempre el mismo.
  • Usted está viendo este comportamiento porque usted está haciendo una referencia en la matriz (day._d) y no una copia de su valor durante la iteración.
InformationsquelleAutor Chris | 2015-01-18

1 Comentario

  1. 23

    Como danludwig menciona en su comentario sobre la pregunta, usted es la adición de una referencia para la misma fecha a la matriz varias veces.

    De la Moment.js documentación:

    Cabe señalar que los momentos son mutables. Llamar a cualquiera de los métodos de manipulación de la voluntad de cambio del momento original.

    Si desea crear una copia y manipularlo, usted debe utilizar momento#clon antes de manipular el momento.

    Usted debe llamar a la clone función en el Momento de la fecha de objeto, como se muestra aquí.

    var startOfWeek = moment().startOf('week');
    var endOfWeek = moment().endOf('week');
    var days = [];
    var day = startOfWeek;
    while (day <= endOfWeek) {
    days.push(day.toDate());
    day = day.clone().add(1, 'd');
    }
    console.log(days);

    Como un aparte:

    Que no debe referencia interna campos/funciones de una 3ª parte de la biblioteca. El nombre de estas referencias son más propensos a cambio de la API pública se describe en la documentación. _d se puede hacer referencia a llamar a la de la función pública toDate.

    • Es impresionante! Gracias Taylor!

Dejar respuesta

Please enter your comment!
Please enter your name here