@TuMko

Как отсортировать массив пар [ключ, значение]?

Методом Object.entries из исходного объекта был получен массив пар [ключ, значение].
Массив выглядит таким образом:
[
  ['51-55', 4],
  ['26-30', 4],
  ['до 20', 1],
  ['36-40', 9],
  ['41-45', 10],
  ['20-25', 1],
  ['31-35', 4],
  ['за 60', 3],
  ['46-50', 8],
  ['56-60', 6]
]


Необходимо отсортировать по первому значению, только на первом месте должен быть ['до 20', 1], далее по порядку ['20-25', 1], ['26-30', 4], ... и на последнем месте ['за 60', 3].
Мой код ниже сортирует в алфавитном порядке, и значения ['до 20', 1] и ['за 60', 3] соответственно оказываются в самом конце массива. Как эти два элемента отсортировать вместе с остальными в одной функции?

let sortableArr = Object.entries(agesResult);
      sortableArr.sort((a, b) => {
        if (a[0] > b[0]) {
          return 1;
        } else if (a[0] < b[0]) {
          return -1;
        } else {
          return 0;
        }
      });
  • Вопрос задан
  • 426 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const sorted = (arr, key) => arr
  .map(n => [ key(n), n ])
  .sort(([a], [b]) => a < b ? -1 : +(a > b))
  .map(n => n[1]);

Так как сортировка сбивается из-за наличия нечисловых символов в начале некоторых строк, просто вырежем их:

const sortedArr = sorted(arr, n => n[0].replace(/^\D+/, ''));

Если же значения могут быть не только двухзначными, то сравнивать их как строки уже нельзя. Делаем из них настоящие числа, считаем сумму; если второе слагаемое отсутствует, используем первое повторно:

const sortedArr = sorted(arr, n => {
  const d = n[0].match(/\d+/g);
  return +d[0] + +d.at(-1);
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы