Как я могу отсортировать массив событий по месяцу, в котором они происходят?
Например, я хочу отсортировать этот массив events
:
[{ event: 'prom', month: 'MAY' },
{ event: 'graduation', month: 'JUN' },
{ event: 'dance', month: 'JAN' }]
Чтобы стать этим массивом:
[{ event: 'dance', month: 'JAN' },
{ event: 'prom', month: 'MAY' },
{ event: 'graduation', month: 'JUN' }]
Также предоставляется массив МЕСЯЦЕВ:
const MONTHS = [
'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN',
'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'
];
Я пытаюсь отсортировать массив events
с помощью метода сортировки, но он сортируется только в алфавитном порядке. Может ли кто-нибудь помочь мне понять, как я могу сортировать по календарному порядку месяцев?
const MONTHS = [
'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN',
'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'
];
function sortByMonth(events) {
events.sort((a,b) =>
a.month.localeCompare(b.month)
)
}
2 ответа
Вы можете отсортировать по индексам месяцев.
const
MONTHS = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'],
events = [{ event: 'prom', month: 'MAY' }, { event: 'graduation', month: 'JUN' }, { event: 'dance', month: 'JAN' }];
events.sort((a, b) => MONTHS.indexOf(a.month) - MONTHS.indexOf(b.month));
console.log(events);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Если у вас когда-либо нет свойства month
или значение отличается от данных месяцев, вы можете добавить значение по умолчанию для перемещения этого элемента вверх (0
) или вниз (Number.MAX_VALUE
или больше значение, чем длина массива).
const
MONTHS = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'],
events = [{ event: 'prom', month: 'MAY' }, { event: 'party', month: '' }, { event: 'graduation', month: 'JUN' }, { event: 'dance', month: 'JAN' }];
events.sort((a, b) =>
(MONTHS.indexOf(a.month) + 1 || Number.MAX_VALUE) -
(MONTHS.indexOf(b.month) + 1 || Number.MAX_VALUE)
);
console.log(events);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Использование Array#indexOf
:
const
arr = [ { event: 'prom', month: 'MAY' }, { event: 'graduation', month: 'JUN' }, { event: 'dance', month: 'JAN' } ],
MONTHS = [ 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' ];
arr.sort((a, b) => MONTHS.indexOf(a.month) - MONTHS.indexOf(b.month));
console.log(arr);
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.