Как я могу получить массив дат между 2 датами? - PullRequest
1 голос
/ 06 ноября 2019

Мой случай таков:

let arr = [
  {id:1,fromDate:'2019-06-01',toDate:'2019-06-03'},
  {id:2,fromDate:'2019-10-15',toDate:'2019-10-15'},
  {id:3,fromDate:'2019-12-01',toDate:'2019-12-03'},
  {id:4,fromDate:'2019-12-25',toDate:'2019-12-26'},
  {id:5,fromDate:'2019-12-29',toDate:'2019-12-31'}
]

let tempDates = []

arr.forEach(element => {

  let now = moment()

  let fromDate = moment(element.fromDate)
  let toDate = moment(element.toDate)

  if (fromDate > now && toDate > now) {
    while (fromDate <= toDate) {
      let ld = fromDate.format('YYYY-MM-DD')
      tempDates.push(ld)
    }
  }
})

Демонстрация и полный код: https://codepen.io/positivethinking639/pen/yLLvWGR?editors=1010

Я пытаюсь использовать while, чтобы получить массив дат. Но кажется, что цикл make не останавливается

Как я могу решить эту проблему?

Я хочу сохранить fromDate в массиве tempDates

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Вам нужно увеличить значение fromDate, иначе ваш цикл while никогда не закончится. Вы можете использовать момент для увеличения даты на единицу с помощью .add(1,'days'), в котором вы храните даты в своих временных датах, вы можете выйти из них после цикла while, и тогда он будет содержать все ваши даты с шагом в один день.

["2019-12-01", "2019-12-02", "2019-12-03", "2019-12-25", "2019-12-26", "2019-12-29", "2019-12-30", "2019-12-31"]

Это будет содержимое вашего массива.

let arr = [
  {id:1,fromDate:'2019-06-01',toDate:'2019-06-03'},
  {id:2,fromDate:'2019-10-15',toDate:'2019-10-15'},
  {id:3,fromDate:'2019-12-01',toDate:'2019-12-03'},
  {id:4,fromDate:'2019-12-25',toDate:'2019-12-26'},
  {id:5,fromDate:'2019-12-29',toDate:'2019-12-31'}
]

let tempDates = []

arr.forEach(element => {

  let now = moment()

  let fromDate = moment(element.fromDate)
  let toDate = moment(element.toDate)

  if (fromDate > now && toDate > now) {
    while (fromDate <= toDate) {
      let ld = fromDate.format('YYYY-MM-DD')
      tempDates.push(ld)
      fromDate = moment(fromDate).add(1,'days');
    }
  }

})
console.log('dates', tempDates);

https://codepen.io/Kaehler/pen/abbYLqX?editors=1010

Это должно сохранить ваш массив с датами. Ваш код if (fromDate > now && toDate > now) { делает первые два объекта в массиве arr не включенными в цикл while. Вы, вероятно, должны проверить, если fromdate <= toDate также.

0 голосов
/ 06 ноября 2019

Ваш текущий код близок, но вы попали в ваш if / while из-за ваших операторов. fromDate должно быть меньше toDate для того, чтобы прийти к любой промежуточной дате. Если fromDate совпадает с toDate, давайте просто вернем эту дату, чтобы наш результирующий массив не имел несовпадающих индексов.

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  mounted () {

    let arr = [
      {id:1,fromDate:'2019-06-01',toDate:'2019-06-03'},
      {id:2,fromDate:'2019-10-15',toDate:'2019-10-15'},
      {id:3,fromDate:'2019-12-01',toDate:'2019-12-03'},
      {id:4,fromDate:'2019-12-25',toDate:'2019-12-26'},
      {id:5,fromDate:'2019-12-29',toDate:'2019-12-31'}
    ]

    let tempDates = []

    arr.forEach(element => {

      let now = moment()

      let fromDate = moment(element.fromDate)
      let toDate = moment(element.toDate)
      dateArray = []
      if (fromDate < toDate) {
        while (fromDate <= toDate) {
          let ld = fromDate.format('YYYY-MM-DD')
          dateArray.push(ld)
          fromDate = moment(fromDate).add(1,'days');
        } 

      }else {
          dateArray.push(fromDate.format('YYYY-MM-DD'))
        }
       tempDates.push(dateArray)
    })

    console.log(tempDates);
  },
})

В этом решении также был добавлен массив в forEach для того, чтобысобирать соответствующие даты из каждого элемента и хранить их отдельно, которые затем помещаются в массив tempDates. Вывод этого кода:

[["2019-06-01", "2019-06-02", "2019-06-03"], ["2019-10-15"], ["2019-12-01", "2019-12-02", "2019-12-03"], ["2019-12-25", "2019-12-26"], ["2019-12-29", "2019-12-30", "2019-12-31"]]

См. CodePen здесь: Решение

Конечно, вы можете отформатировать выходные данные, как вам угодно, у меня естьразделил информацию, так как схема для вывода не была детально указана.

Примечание: Вы также можете отказаться от forEach и использовать reduce() для достижения этой цели. В этом ответе я придерживался вашего оригинального стиля кода и подхода, который не ошибается, но есть альтернативные подходы.

...