Как я могу отсортировать массив событий по месяцу, в котором они происходят?

Например, я хочу отсортировать этот массив 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)
    )
}
1
Ultima 25 Ноя 2022 в 22:00

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; }
1
Nina Scholz 25 Ноя 2022 в 22:10

Использование 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);
1
Majed Badawi 25 Ноя 2022 в 22:03