Кратко
СкопированоМетод sort
сортирует элементы в массиве, изменяет порядок элементов в исходном массиве. По умолчанию сортировка выполняется в порядке возрастания. Каждый элемент массива приводятся к строке, и приведённые результаты сравниваются между собой.
Метод sort
является устойчивым, то есть элементы в массиве будут находиться в том же порядке, в каком они располагались в исходном массиве. Eсли два элемента равны, то первый по порядку в исходном массиве будет первым и в результирующем массиве.
Мы можем передать функцию-компаратор для кастомизации логики сравнения элементов. Функция определяет, как пара элементов сравнивается между собой.
Метод возвращает ссылку на исходный массив.
Пример сортировки по умолчанию
Скопированоconst nums = [15, 0, 4]const strings = ['a', 'c', 'b']nums.sort()console.log(nums)// [0, 15, 4]strings.sort()console.log(strings)// ['a', 'b', 'c']
const nums = [15, 0, 4] const strings = ['a', 'c', 'b'] nums.sort() console.log(nums) // [0, 15, 4] strings.sort() console.log(strings) // ['a', 'b', 'c']
Как пишется
СкопированоМетод имеет только один опциональный параметр — функцию-компаратор sort
.
В функцию-компаратор передаются два аргумента a
и b
. Результат сравнения возвращаемого значения из функции с 0 определяет порядок элементов:
- значение меньше 0 означает, что элемент
a
меньше, чем элементb
; - значение больше 0 означает, что элемент
a
больше, чем элементb
; - значение равно 0 означает, что элементы равны.
Все элементы массива со значением undefined
после сортировки попадут в конец массива. Для этих элементов не будет вызываться функция compare
.
Пример функции-компаратора для сортировки чисел
Скопированоfunction compareFn(a, b) { if (a < b) { return -1 } else if (a > b) { return 1 } // a === b return 0}
function compareFn(a, b) { if (a < b) { return -1 } else if (a > b) { return 1 } // a === b return 0 }
Так как имеет значение только знак возвращаемого значения, можно упростить:
function compareFn(a, b) { return a - b}
function compareFn(a, b) { return a - b }
Также можно определить с помощью стрелочной функции:
const compareFn = (a, b) => a - b
const compareFn = (a, b) => a - b
Пример сортировки чисел по возрастанию
Скопированоconst nums = [3, 4, 0]const compareFn = (a, b) => a - bnums.sort(compareFn)console.log(nums)// [0, 3, 4]
const nums = [3, 4, 0] const compareFn = (a, b) => a - b nums.sort(compareFn) console.log(nums) // [0, 3, 4]
Пример сортировки чисел по убыванию
Скопированоconst nums = [3, 4, 0]// В отличие от сортировки по возрастанию, здесь вычитаем из второго элемента первыйconst compareFn = (a, b) => b - anums.sort(compareFn)console.log(nums)// [4, 3, 0]
const nums = [3, 4, 0] // В отличие от сортировки по возрастанию, здесь вычитаем из второго элемента первый const compareFn = (a, b) => b - a nums.sort(compareFn) console.log(nums) // [4, 3, 0]
Как понять
СкопированоМетод sort
работает так же, как и метод to
. Основное отличие в том, что метод sort
мутирует (изменяет) исходный массив, а метод to
возвращает новый массив с отсортированными элементами.
const nums = [20, 1, -10]const toSortedNums = nums.toSorted((a, b) => a - b)console.log(nums)// [20, 1, -10]console.log(toSortedNums)// [-10, 1, 20]const sortedNums = nums.sort((a, b) => a - b)console.log(nums)// [-10, 1, 20]console.log(sortedNums)// [-10, 1, 20]console.log(nums === sortedNums)// true
const nums = [20, 1, -10] const toSortedNums = nums.toSorted((a, b) => a - b) console.log(nums) // [20, 1, -10] console.log(toSortedNums) // [-10, 1, 20] const sortedNums = nums.sort((a, b) => a - b) console.log(nums) // [-10, 1, 20] console.log(sortedNums) // [-10, 1, 20] console.log(nums === sortedNums) // true