javascript для l oop момент приращения js дата на 1 день, - PullRequest
1 голос
/ 09 мая 2020
const datePeriod = ("2020-05-13") => {
  const date = moment(dateFrom);
  var dates = [];
  for (var i = 0; i < 30; i++) {

    dates.push({ date: date.add(i, "days").format("YYYY-MM-DD") });

  }
  console.log(dates);
};

я хочу получить результат, как показано ниже

[{"date": "2020-05-13"}, {"date": "2020-05-15"}, {"date ":" 2020-05-16 "}, {" date ":" 2020-05-17 "}, {" date ":" 2020-05-28 "......}]

но я действительно получаю как показано ниже, почему это? предполагается, что нужно увеличить на 1, правильно?

[{"date": "2020-05-13"}, {"date": "2020-05-14"}, {"date": "2020 -05-16 "}, {" date ":" 2020-05-19 "}, {" date ":" 2020-05-23 "......}]

Ответы [ 3 ]

1 голос
/ 09 мая 2020

Вы должны переместить dateFrom inside для l oop вместо глобального.

 for (var i = 0; i < 30; i++) {
    const date = moment(dateFrom);
    dates.push({ date: date.add(i, "days").format("YYYY-MM-DD") });
  }

const datePeriod = (dateFrom) => {
  
  var dates = [];
  for (var i = 0; i < 30; i++) {
    const date = moment(dateFrom);
    dates.push({ date: date.add(i, "days").format("YYYY-MM-DD") });
  }
  console.log(dates);
};

 datePeriod("2020-05-13");
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.min.js" integrity="sha256-zG8v+NWiZxmjNi+CvUYnZwKtHzFtdO8cAKUIdB8+U9I=" crossorigin="anonymous"></script>
0 голосов
/ 09 мая 2020

Это потому, что на каждой итерации i увеличивается на 1, а вы изменяете дату на месте , поэтому приращение становится аддитивным, то есть вы +1 день в первой итерации, а затем на следующей итерации вы используете новую дату и еще +2 дня до нее, и так далее и тому подобное.

Возможное исправление: либо всегда добавлять 1 день в l oop вместо i:

dates.push({ date: date.add(1, "days").format("YYYY-MM-DD") });

, либо вы можете создавать новый объект момента на каждой итерации, но это немного дороже. Другими словами, вы перемещаете объявление const в l oop:

for (let i = 0; i < 30; i++) {
    const date = moment(dateFrom);
    dates.push({ date: date.add(i, "days").format("YYYY-MM-DD") });
}
0 голосов
/ 09 мая 2020

date.add изменит начальную дату. Если вы хотите, чтобы изменял начальную дату, вы можете просто добавлять 1 каждый раз:

dates.push({ date: date.add(1, "days").format("YYYY-MM-DD") });

Другой вариант - клонировать дату на каждом l oop, чтобы убедитесь, что вы не изменяете исходную дату:

const copiedDate = moment(date);
dates.push({ date: copiedDate.add(i, "days").format("YYYY-MM-DD") });
...