#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
}, [])