Массив неправильно заполнен датами - PullRequest
0 голосов
/ 24 марта 2020

У меня проблема с заполнением массива датами.

Я пытаюсь получить последние 12 месяцев + текущий месяц, давая мне всего 13 месяцев, которые я хочу добавить в список выбора.

Как только документ будет готов, я заполнение массива датами.

Я попытался заполнить массив дат непосредственно в PopulateDates () вместо dateArray, но это все равно дало тот же эффект при записи в консоль вне функции.

Чего мне здесь не хватает?

$(document).ready(function() {
  var dates = new Array();
  dates = PopulateDates();

  for (var i = 0; i < dates.length; i++) {
    console.log("Date " + i + ": " + dates[i]);
    // This returns April 01 2020 for each field
  }
});

function PopulateDates() {
  var datesArray = new Array();

  var startDate = new Date();
  startDate.setUTCFullYear(startDate.getUTCFullYear() - 1, startDate.getUTCMonth(), 1);

  var dateIterator = startDate;

  for (var i = 0; i < 13; i++) {
    datesArray.push(dateIterator);
    console.log("Added: " + dateIterator);
    //This returns different dates correctly.
    //Starting from March 2019 to March 2020

    dateIterator.setMonth(dateIterator.getMonth() + 1);
  }

  return datesArray;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Это происходит потому, что в массив помещается один и тот же объект. Сделайте клон итератора и затем поместите его в массив.

let clone = new Date(dateIterator.getTime());
datesArray.push(clone);
1 голос
/ 24 марта 2020

Таким образом, другой ответ определил причину, по которой вы не получали разные месяцы. Это то, что вы на самом деле искали?

$(function() {
  const $sel = $("#months");
  let date = new Date();
  date.setUTCFullYear(date.getUTCFullYear() - 1, date.getUTCMonth(), 3); // normalise on 3rd of the month so all locales has the same month
  for (let i = 0; i <= 12; i++) {
    const month = date.toLocaleString('default', { month: 'long' });
    const monthNum = date.getMonth() + 1;
    $sel.append(`<option value="${monthNum}">${date.getFullYear()} - ${month}</option>`)
    date.setMonth(date.getMonth() + 1);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="months">
  <option value="">Please select</option>
</select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...