Методы сортировки массивов

Методы сортировки массивов

Технический фундамент сортировки

sort использует функцию сравнения, которая должна возвращать число:

  • < 0a перед b;
  • 0 — порядок не меняется;
  • > 0a после b.
const nums = [3, 1, 2];
nums.sort((a, b) => a - b);

console.log(nums); // [1, 2, 3]

Ключевой момент: корректный comparator — это контракт сортировки, а не просто «любая функция».

База: sort()

sort() сортирует массив на месте (изменяет исходный массив) и по умолчанию сравнивает элементы как строки.

const words = ['banana', 'apple', 'cherry'];
words.sort();

console.log(words); // ['apple', 'banana', 'cherry']

Смотри, что важно: sort возвращает ссылку на тот же массив (а не новый).

const a = [3, 1, 2];
const result = a.sort((x, y) => x - y);

console.log(result === a); // true

Важная ловушка с числами

По умолчанию числа тоже сортируются как строки.

const nums = [2, 10, 5];
nums.sort();

console.log(nums); // [10, 2, 5]  (не то, что ожидаешь)

Правильный способ — передать функцию сравнения.

nums.sort((a, b) => a - b); // по возрастанию
console.log(nums); // [2, 5, 10]

nums.sort((a, b) => b - a); // по убыванию
console.log(nums); // [10, 5, 2]

Проверь себя: почему a - b работает для чисел лучше, чем сортировка по умолчанию?

Сортировка строк с учетом языка

Для строк полезно использовать localeCompare.

const names = ['Яна', 'Антон', 'Борис'];
names.sort((a, b) => a.localeCompare(b, 'ru'));

console.log(names); // ['Антон', 'Борис', 'Яна']

Сортировка массива объектов

Частый реальный случай — массив объектов.

const products = [
  { title: 'Mouse', price: 1200 },
  { title: 'Keyboard', price: 3000 },
  { title: 'Cable', price: 500 },
];

products.sort((a, b) => a.price - b.price);
console.log(products.map((p) => p.title)); // ['Cable', 'Mouse', 'Keyboard']

Микро-сценарии

  1. Сортировка карточек товаров по цене.
  2. Сортировка списка сотрудников по фамилии.

Анти-провал: если исходный массив нельзя менять (например, state в UI), делай копию.

const sorted = [...products].sort((a, b) => a.price - b.price);

В современных окружениях еще есть toSorted(...), который сразу возвращает новый массив без мутации:

const sorted2 = products.toSorted((a, b) => a.price - b.price);

Типичные ошибки

  • Забывать, что sort мутирует массив.
  • Сортировать числа без compare-функции.
  • Писать compare, который возвращает true/false вместо числа.
  • Не учитывать локаль при сортировке строк на кириллице.

Краткий итог

  • sort() сортирует массив на месте.
  • Для чисел почти всегда нужен sort((a, b) => a - b).
  • Для строк с языковыми правилами используй localeCompare.
  • Для массива объектов сортируй по нужному полю.
  • Если важна неизменяемость, сортируй копию массива.