Методы сортировки массивов
Методы сортировки массивов
Технический фундамент сортировки
sort использует функцию сравнения, которая должна возвращать число:
< 0—aпередb;0— порядок не меняется;> 0—aпосле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']
Микро-сценарии
- Сортировка карточек товаров по цене.
- Сортировка списка сотрудников по фамилии.
Анти-провал: если исходный массив нельзя менять (например, 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. - Для массива объектов сортируй по нужному полю.
- Если важна неизменяемость, сортируй копию массива.