Кратко
СкопированоМетод 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