alexbuki
@alexbuki
программист js

Как отсортировать массив по статусу?

Есть массив:

[
  {teamid: 8,  game_status: 'Групповой'},
  {teamid: 4,  game_status: 'Финал'},
  {teamid: 3,  game_status: 'Матч за 3 место'},
  {teamid: 5,  game_status: 'Групповой'},
  {teamid: 6,  game_status: 'Групповой'},
  {teamid: 7,  game_status: 'Четвертьфинал'},
  {teamid: 2,  game_status: 'Четвертьфинал'},
  {teamid: 12,  game_status: 'Матч за 3 место'},
]

Надо отсортировать его, чтобы порядок был такой:
Групповой, Четвертьфинал, Матч за 3 место, Финал.

Пробовал так:

const gameTypeOrder = ['Групповой', 'Четвертьфинал', 'Матч за 3 место', 'Финал'];
    const sortByGameType = (a, b) => {
      gameTypeOrder.indexOf(b[1]) > gameTypeOrder.indexOf(a[1])? -1:1
    }
    res.sort(sortByGameType);

Почему-то криво сортирует.
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Сделать объект, где ключами будут статусы, а значениями - их индексы в массиве, задающем порядок сортировки:

const order = Object.fromEntries(gameTypeOrder.map((n, i) => [ n, i ]));

Дальше можно отсортировать существующий массив:

res.sort((a, b) => order[a.game_status] - order[b.game_status]);

Или собрать отсортированный новый:

const sortedRes = res
  .reduce((acc, n) => (acc[order[n.game_status]].push(n), acc), gameTypeOrder.map(() => []))
  .flat();

// или

const sorted = (arr, key) => arr
  .map(n => [ n, key(n) ])
  .sort((a, b) => a[1] - b[1])
  .map(n => n[0]);


const sortedRes = sorted(res, n => order[n.game_status]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы