Javascript: получение последовательных дней из массива?

#javascript

#javascript

Вопрос:

У меня есть массив дат ISO, ["2019-09-10", "2019-09-14", "2019-09-11", "2019-09-22","2019-09-25"]; я пытаюсь найти наилучший подход для возврата массива объектов, которые являются парами. Например:

 let results: [
   {start: 2019-09-10, end: 2019-09-11},
]
  

Я попытался использовать миллисекунды для сравнения, но, похоже, он просто возвращает тот же день, {start: 2019-09-11, end: 2019-09-11}

Комментарии:

1. Каков критерий для определения, являются ли они парами?

2. Я не понимаю, чего вы пытаетесь достичь. Итак, у вас есть массив дат, и вы хотите сгруппировать их в пары на основе ближайшего различия?

3. И если это ближайшая группа, в массиве всего 5 элементов. Что должно произойти, когда останется только один?

4. Я хочу просто регистрировать пары дней подряд

Ответ №1:

Один из способов сделать это — сначала отсортировать элементы по датам, затем сравнить их попарно, чтобы увидеть, являются ли они последовательными. В приведенном ниже примере я использую date-fns , чтобы проанализировать их и упростить их сравнение, но вы, вероятно, могли бы обойтись без этого.

Реальный ключевой вывод — это сортировка элементов, а затем их уменьшение. Функция reducer может принимать больше, чем просто accumulator и currentValue ; вы также можете получить индекс и массив, который повторяется. Последние два позволяют легко найти следующий элемент и сравнить его, чтобы увидеть, нужно ли что-то добавить к accumulator .

 const addDays = require('date-fns/addDays')
const parse = require('date-fns/parseISO')

const dates = ["2019-09-10", "2019-09-14", "2019-09-11", "2019-09-22","2019-09-25"]

//First, we map them to date objects, and sort the new list.
const sorted = dates.map(d => parse(d)).sort((a,b) => a-b)

//Then we reduce over the entire list, checking pairwise for the dates to be consecutive
const pairs = sorted.reduce((pairs, start, i, dates) => {
  const end = dates[i 1]
  if (addDays(start, 1)-end === 0) pairs.push({start, end})
  return pairs
}, [])