Как работает метод sort в js?
Метод массива sort(), как можно догадаться из названия - занимается сортировкой содержимого на вызванном массиве.
Данный метод имеет особенности:
- Мутирует исходный массив. Т.е. данный метод не возвращает новый, а именно меняет тот массив, на котором происходит вызов.
- Может принимать в качестве аргумента функцию-компаратор, или сортирует в лексическом порядке по возрастанию, если функция не задана.
Рассмотрим синтаксис подробнее:
// Выполнить сортировку по умолчанию
someArray.sort()
// Выполнить сортировку с использованием стрелочной функции для сравнения
someArray.sort((a, b) => { ... } )
// Выполнить сортировку с помощью функции сравнения
someArray.sort(compareFn)
Рассмотрим пример:
const numbers = [34, 26, 356, 12, 9, 5, 10];
numbers.sort();
console.log(numbers);
// -> [10, 12, 26, 34, 356, 5, 9]
Вывод может озадачить, но мы помним, что метод sort()
по умолчанию сортирует в лексическом порядке по возрастанию. Т.е. перед сравнением значения будут переведены в строку.
Чтобы добиться желаемого результата, нужно написать функцию-аргумент, в которой и указать способ сравнения. Функция-компаратор в свою очередь, если она предоставлена,
определяет сортировку всех элементов в массиве за исключением undefined. Все неопределенные элементы просто будут поставлены в конец массива, и неопределенные элементы не передаются в функцию сравнения.
const numbers = [34, 26, 356, 12, 9, 5, 10];
numbers.sort((a, b) => a - b);
console.log(numbers);
// -> [5, 9, 10, 12, 26, 34, 356]
Как в данном случае работает функция-компаратор?
- Если a - b меньше 0, сортировка поставит a по меньшему индексу, чем b, то есть, a идёт первым.
- Если a - b вернёт 0, сортировка оставит a и b неизменными по отношению друг к другу, но отсортирует их по отношению ко всем другим элементам.
- Если a - b больше 0, сортировка поставит b по меньшему индексу, чем a.