Как отсортировать массив по ближайшей предстоящей дате
Подскажите, как можно отсортировать массив с объектами юзеров по ближайшей предстоящей дате (DD MMM). Чтобы в начале были юзеры, у которых предстоящая дата (DD MMM) самая близкая к текущей и далее на отдаление по дате (DD MMM). Год учитывать не надо. Только день и месяц.
Сейчас у меня сортировка только по увеличение даты (DD MMM YYYY).
return Promise.all([birthdays, newcomers, newrole]).then(() => {
return users.sort((a, b) => a.eventDate.valueOf() - b.eventDate.valueOf());
});
Ответы (1 шт):
Автор решения: Kirill
→ Ссылка
Если я правильно понял, то вам необходимо упорядочить список пользователей в порядке приближения endDate к текущей дате.
Я считаю, что учет текущей даты усложняет функцию компаратор, поэтому предлагаю решение в 2 этапа:
- Сортируем список по возрастанию дат без учета года;
- Перестраиваем список, сдвигая в конец списка те элементы, endDate которых уже наступил в этом году.
Вот пример реализации, правда без учета временных зон:
users.sort((u1, u2) => {
const d1 = Number(u1.endDate.format('MMDD'));
const d2 = Number(u2.endDate.format('MMDD'));
if (d1 === d2) {
return 0;
} else {
return d1 > d2 ? 1 : -1;
}
});
const now = Number(moment().format('MMDD'));
const firstSameOrAfter = users.findIndex(u => Number(u.endDate.format('MMDD')) >= now);
if (firstSameOrAfter >=0) {
users = [
...users.slice(firstSameOrAfter),
...users.slice(0, firstSameOrAfter)
]
}


