Задать вопрос
@arseniy88

Как отсортировать массив от определенного числа (по возрастанию) JavaScript?

Как отсортировать массив от определенного числа (по возрастанию) JavaScript?

Есть массив и ключ от которого нужно сортировать:

const arr = [5, 7, 10, 100, 65, 43, 63, 15, 18, 70, 1, 3];
const index = 10;

Использую метод sort:

arr.sort((a, b) => index - a + b);

На выхлопе: 5fb90c96b0376376755883.png

Подскажите как решить и что я делаю не так?
  • Вопрос задан
  • 269 просмотров
Подписаться 1 Простой 6 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Эдюсон
    Fullstack-разработчик на JavaScript + ИИ
    11 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Инженер по тестированию + ИИ
    6 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Надо проверять, как элементы соотносятся с граничным значением. Если оба меньше, то ничего не делаем; если только один меньше, тогда другой должен уехать вперёд; оба должны быть подвергнуты сортировке - действуем как обычно. Вот так всё просто получается:

const arr = [5, 7, 10, 100, 65, 43, 63, 15, 18, 70, 1, 3];
const minToSort = 10;

arr.sort((a, b) => (
  a < minToSort ? +(b >= minToSort) :
  b < minToSort ?                -1 :
                              b - a
));

console.log(arr); // [100, 70, 65, 63, 43, 18, 15, 10, 5, 7, 1, 3]

Или, можно решить задачу в более общем виде - cделаем функцию частичной сортировки. Раскладываем значения в два массива; один сортируем, другой нет; объединяем их. Тоже ничего сложного:

function toPartiallySorted(data, {
  sort = () => true,
  key = n => n,
  prepend = true,
} = {}) {
  const getKey = key instanceof Function ? key : n => n[key];
  const toSort = [];
  const result = [];
  let i = -1;

  for (const n of data) {
    if (sort(n, ++i)) {
      toSort.push([ getKey(n), n ]);
    } else {
      result.push(n);
    }
  }

  toSort.sort(([a], [b]) => a < b ? -1 : +(a > b));
  result.splice(prepend ? 0 : result.length, 0, ...toSort.map(n => n[1]));

  return result;
}

Как применить эту функцию в вашем случае:

arr.splice(0, arr.length, ...toPartiallySorted(arr, {
  sort: n => n >= minToSort,
  key: n => -n,
}));

Элементами массива могут быть не только числа, но и, например, объекты:

toPartiallySorted([{x:3}, {x:6}, {x:1}, {x:5}, {x:2}, {x:4}], {
  sort: (_, i) => i < 3,
  key: 'x',
  prepend: false,
}) // [{x:5}, {x:2}, {x:4}, {x:1}, {x:3}, {x:6}]

Или это может быть не массив, а строка:

toPartiallySorted('hello, world!!', { sort: n => n <= 'h' }).join('') // ' !!,dehlloworl'

Да хоть коллекция DOM-элементов:

<table>
  <tbody>
    <tr><td>216</td></tr>
    <tr><td>-789</td></tr>
    <tr><td>-3</td></tr>
    <tr class="no-sort"><td>58</td></tr>
    <tr><td>124</td></tr>
    <tr class="no-sort"><td>-100</td></tr>
  </tbody>
</table>

const [ tbody ] = document.querySelector('table').tBodies;
tbody.append(...toPartiallySorted(tbody.rows, {
  sort: n => !n.classList.contains('no-sort'),
  key: n => +n.textContent,
}));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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