Sort: примеры (JAVASCRIPT)
sort([compareFunction]: Function): ArrayФункция sort в JavaScript
Метод sort() применяется к массивам для изменения порядка их элементов. Сортировка происходит на месте, что означает модификацию исходного массива. Метод также возвращает ссылку на отсортированный массив.
Использование метода sort() целесообразно, когда требуется упорядочить элементы массива по заданному критерию.
Аргументы
Метод принимает один необязательный аргумент — функцию сравнения compareFunction(a, b).
- Если функция сравнения не предоставлена, элементы преобразуются в строки и сортируются в соответствии с порядком кодовых единиц UTF-16.
- Функция сравнения принимает два аргумента,
aиb, представляющих два сравниваемых элемента.
Логика функции сравнения
Функция должна возвращать число, которое определяет порядок сортировки:
- Если возвращается значение меньше нуля, элемент
aпомещается перед элементомb. - Если возвращается значение больше нуля, элемент
aпомещается после элементаb. - Если возвращается ноль, порядок элементов
aиbостается неизменным относительно друг друга.
Возвращаемое значение
Метод возвращает ссылку на отсортированный исходный массив. Важно отметить, что никакой новый массив не создается.
Короткие примеры использования
Сортировка строк по умолчанию
Без функции сравнения элементы приводятся к строкам.
let fruits = ['арбуз', 'Яблоко', 'банан'];
fruits.sort();
console.log(fruits);['Яблоко', 'арбуз', 'банан']
Регистр символов влияет на порядок, так как сравниваются коды UTF-16.
Числовая сортировка
Для корректной сортировки чисел требуется функция сравнения.
let numbers = [40, 100, 1, 5, 25];
numbers.sort((a, b) => a - b);
console.log(numbers);[1, 5, 25, 40, 100]
Сортировка объектов по свойству
let users = [
{ name: 'Мария', age: 28 },
{ name: 'Алексей', age: 30 },
{ name: 'Ольга', age: 25 }
];
users.sort((a, b) => a.age - b.age);
console.log(users);[
{ name: 'Ольга', age: 25 },
{ name: 'Мария', age: 28 },
{ name: 'Алексей', age: 30 }
]Сортировка в обратном порядке
let numbers = [1, 5, 25, 40, 100];
numbers.sort((a, b) => b - a);
console.log(numbers);[100, 40, 25, 5, 1]
Похожие функции в JavaScript
В JavaScript существуют другие методы для работы с порядком элементов, но они не являются прямой заменой sort().
Метод reverse()
Изменяет порядок элементов массива на обратный. Не выполняет сортировку, а просто инвертирует текущую последовательность.
let arr = [1, 2, 3];
arr.reverse();
console.log(arr); // [3, 2, 1]Предпочтительнее использовать, когда нужен строго обратный порядок существующего массива.
Ручная сортировка с помощью циклов
Можно реализовать алгоритмы сортировки (пузырьком, быструю, слиянием) вручную. Это требуется в исключительных случаях для образовательных целей или при работе со специфичными структурами данных, где встроенный метод неэффективен. В подавляющем большинстве ситуаций sort() является оптимальным выбором.
Типичные ошибки
Сортировка чисел без функции сравнения
Самая распространенная ошибка — попытка отсортировать массив чисел без предоставления функции сравнения.
let numbers = [10, 5, 80, 2, 9];
numbers.sort();
console.log(numbers);[10, 2, 5, 80, 9]
Результат не соответствует числовому порядку, так как числа преобразуются в строки и сравниваются лексикографически.
Непонимание сортировки на месте
Метод изменяет исходный массив. Если нужно сохранить исходный порядок, следует создать его копию.
let original = [3, 1, 4, 2];
let sorted = original.sort(); // Неправильно! Оба массива теперь отсортированы.
console.log(original); // [1, 2, 3, 4]
console.log(sorted); // [1, 2, 3, 4]
// Правильный подход:
let original2 = [3, 1, 4, 2];
let sortedCopy = [...original2].sort((a, b) => a - b);
console.log(original2); // [3, 1, 4, 2]
console.log(sortedCopy); // [1, 2, 3, 4]Некорректная функция сравнения для сложных условий
Функция сравнения должна быть чистой и детерминированной. Например, попытка сортировки с использованием асинхронных операций или случайных значений приведет к непредсказуемым результатам.
Изменения в последних версиях
Спецификация метода sort() в ECMAScript долгое время оставалась стабильной. Однако с недавних пор алгоритм, используемый движками JavaScript для реализации сортировки, стал стабильным.
Стабильность сортировки означает, что если два элемента считаются равными согласно функции сравнения, их относительный порядок в отсортированном массиве останется таким же, как и в исходном.
Например, в старых движках (или согласно старой спецификации) результат мог быть разным. Теперь, начиная с ES2019 (ECMAScript 2019), алгоритм сортировки гарантированно стабилен.
let items = [
{ type: 'фрукт', name: 'яблоко' },
{ type: 'овощ', name: 'морковь' },
{ type: 'фрукт', name: 'груша' }
];
// Сортируем только по типу
items.sort((a, b) => a.type.localeCompare(b.type));
console.log(items);
// Гарантированный порядок 'яблоко' перед 'грушей', так как они оба 'фрукт'
// и сохраняли этот порядок в исходном массиве.Расширенные примеры
Сортировка по нескольким полям
Сначала сортировка по первому критерию, при равенстве — по второму.
let people = [
{ name: 'Иван', age: 30, city: 'Москва' },
{ name: 'Анна', age: 25, city: 'Санкт-Петербург' },
{ name: 'Петр', age: 30, city: 'Москва' },
{ name: 'Анна', age: 28, city: 'Казань' }
];
people.sort((a, b) => {
// Сначала по возрасту (по возрастанию)
if (a.age !== b.age) {
return a.age - b.age;
}
// Если возраст равен, по имени (лексикографически)
return a.name.localeCompare(b.name);
});
console.log(people);[
{ name: 'Анна', age: 25, city: 'Санкт-Петербург' },
{ name: 'Анна', age: 28, city: 'Казань' },
{ name: 'Иван', age: 30, city: 'Москва' },
{ name: 'Петр', age: 30, city: 'Москва' }
]Сортировка строк с учетом локали
Для корректной сортировки строк на разных языках используется метод localeCompare() с указанием локали.
let cities = ['Ёлка', 'Ярославль', 'Екатеринбург', 'Архангельск'];
cities.sort((a, b) => a.localeCompare(b, 'ru'));
console.log(cities);['Архангельск', 'Екатеринбург', 'Ёлка', 'Ярославль']
Случайная "сортировка" (перемешивание Фишера-Йетса)
Использование sort() для случайного порядка не рекомендуется из-за смещения распределения, но для небольших некритичных задач иногда применяется.
let cards = ['Туз', 'Король', 'Дама', 'Валет', '10'];
let shuffled = [...cards].sort(() => Math.random() - 0.5);
console.log(shuffled);Важно:
Для надежного перемешивания массивов лучше использовать алгоритм Фишера-Йетса.
Сортировка по длине строки
let words = ['река', 'океан', 'ручей', 'море'];
words.sort((a, b) => a.length - b.length);
console.log(words);['река', 'море', 'океан', 'ручей']
Сортировка Map по значению
Сортировка структур данных, отличных от простых массивов, часто требует их преобразования.
let scoreMap = new Map([
['Игрок1', 150],
['Игрок2', 85],
['Игрок3', 220]
]);
// Преобразуем в массив пар [ключ, значение], сортируем по значению
let sortedEntries = [...scoreMap.entries()].sort((a, b) => b[1] - a[1]);
let sortedMap = new Map(sortedEntries);
console.log(sortedMap);Map(3) { 'Игрок3' => 220, 'Игрок1' => 150, 'Игрок2' => 85 }Альтернативы в других языках программирования
Python: метод sort() и функция sorted()
В Python list.sort() работает похоже на JavaScript: сортирует список на месте. Функция sorted() возвращает новый отсортированный список, не изменяя исходный. Обе принимают аргумент key для указания функции, вычисляющей ключ сортировки, и reverse для указания порядка.
# Python
numbers = [40, 100, 1, 5, 25]
numbers.sort()
print(numbers) # [1, 5, 25, 40, 100]
# Создание нового списка
new_list = sorted(numbers, reverse=True)
print(new_list) # [100, 40, 25, 5, 1]PHP: функция sort() и другие
Функция sort(&$array) сортирует массив по возрастанию значений, ключи переиндексируются. Для сохранения ассоциации ключей и значений используется asort(). Для сортировки по ключам есть ksort().
// PHP
$numbers = array(40, 100, 1, 5, 25);
sort($numbers);
print_r($numbers); // Array ( [0] => 1 [1] => 5 [2] => 25 [3] => 40 [4] => 100 )MySQL: оператор ORDER BY
В SQL сортировка происходит на уровне запроса к базе данных с помощью ORDER BY. Это принципиально иной подход, так как сортируются строки результата запроса, а не структуры данных в коде приложения.
-- MySQL
SELECT name, age FROM users ORDER BY age DESC;C: функция qsort()
В стандартной библиотеке языка C используется функция qsort(), которая реализует алгоритм быстрой сортировки. Требуется передать указатель на массив, размер элемента, количество элементов и указатель на функцию сравнения, что является более низкоуровневым подходом.
// C
#include
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int arr[] = {40, 100, 1, 5, 25};
qsort(arr, 5, sizeof(int), compare);
// arr теперь отсортирован
return 0;
}