@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;
        }
      });
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const sortedArr = arr
  .map(n => ({
    val: n[0].replace(/\D+/, ''),
    item: n,
  }))
  .sort((a, b) => a.val.localeCompare(b.val))
  .map(n => n.item);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
RAX7
@RAX7
const START_RANGE_KEYWORD = 'до';
const END_RANGE_KEYWORD = 'за';
const SEP_RANGE_KEYWORD = '-';

const data = [
  ['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]
];

const result = data
  .map(d => {
    const res = { raw: d, range: [-Infinity, Infinity] };
    const rangeStr = d[0];
    
    if (rangeStr.includes(SEP_RANGE_KEYWORD)) {
      [res.range[0], res.range[1]] = rangeStr.split('-').map(Number);
      return res;
    }
    
    if (rangeStr.includes(START_RANGE_KEYWORD)) {
      const val = +rangeStr.replace(/\D+/, '');
      [res.range[0], res.range[1]] = [-Infinity, val];
      return res;
    }
    
    if (rangeStr.includes(END_RANGE_KEYWORD)) {
      const val = +rangeStr.replace(/\D+/, '');
      [res.range[0], res.range[1]] = [val, Infinity];
      return res;
    }
    
    return res;
  })
  .sort((a, b) => a.range[0] - b.range[0])
  .map(({ raw }) => raw);

console.log(result);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
03 июл. 2022, в 11:11
250 руб./за проект
03 июл. 2022, в 10:56
500 руб./за проект
03 июл. 2022, в 10:37
4000 руб./за проект