JavaScript метод sort()
Определение и применение
JavaScript метод sort() сортирует массив на месте. По умолчанию он сравнивает строковые представления
элементов по кодовым единицам UTF-16. Это не числовая и не языковая алфавитная сортировка; свой порядок
задаёт функция сравнения. Работу метода показывает пример
«Как сортировать латинские буквы в двух направлениях».
Поддержка браузерами
Спецификация: ecma262
Поддерживается во всех основных браузерах с 2015 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
sort | 1 | 12 | 1 | 4 | 1 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 | 1 |
| Stable sorting | 70 | 79 | 3 | 57 | 10.1 | 70 | 4 | 49 | 10.3 | 10.0 | 70 | 10.3 |
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис
array.sort();
array.sort(compareFunction);Спецификация
ECMAScript: Array.prototype.sort.
Значения параметров
| Параметр | Описание |
|---|---|
compareFunction |
Функция, определяющая порядок сортировки элементов массива. Если функция сравнения используется (необязательный параметр), то должна возвращать одно из следующих значений:
|
Например, для обычного сравнения чисел функцию можно записать так:
function compareFunction(a, b) {
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
}Возвращаемое значение
Тот же отсортированный массив. Для новой копии используйте toSorted().
Особенности
Сортировка стабильна: элементы с равным результатом сравнения сохраняют взаимный порядок.
undefined помещается после определённых значений, а пустые позиции — после undefined; они не
передаются в функцию сравнения. Функция должна задавать согласованный порядок; возвращать только true или
false недостаточно.
Примеры, попробуйте сами
Как сортировать латинские буквы в двух направлениях
В следующем примере с использованием JavaScript метода sort() мы рассмотрим как отсортировать массив по алфавиту от a до z, так и от z до a: Измените значения или критерий сравнения и запустите код. Сравните порядок элементов после сортировки.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
// инициализируем переменную, содержащую массив строковых значений
var arr = ['b', 'n', 'a', 'z', 'm', 'y', 'c']
// сортируем массив в порядке следования кодовых единиц UTF-16
console.log(arr.sort()) // ["a", "b", "c", "m", "n", "y", "z"]
// размещаем элементы объекта Array в обратном порядке
var reversed = arr.reverse()
console.log(reversed) // ["z", "y", "n", "m", "c", "b", "a"]
Куда sort() перемещает пустые позиции
В следующем примере мы рассмотрим как происходит сортировка массива, который содержит пустые элементы ("дыры"): Измените значения или критерий сравнения и запустите код. Сравните порядок элементов после сортировки.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
// инициализируем переменную, содержащую массив строковых значений
var arr = ['b', 'n', 'a', 'z', 'm', , 'y', , 'c']
// сортируем массив в порядке следования кодовых единиц UTF-16
console.log(arr.sort()) // ["a", "b", "c", "m", "n", "y", "z",,,] два пустых значения в конце массива
Почему сортировка чисел по умолчанию не числовая
В следующем примере мы рассмотрим порядок числовых значений при сортировке без функции сравнения: Измените значения или критерий сравнения и запустите код. Сравните порядок элементов после сортировки.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
// инициализируем переменную, содержащую массив числовых значений
var numbers = [50, 4, 33, 88, 1, 11, 123]
// сортируем массив в порядке следования кодовых единиц UTF-16
console.log(numbers.sort()) // [1, 11, 123, 33, 4, 50, 88]
Обратите внимание, что при сортировке без функции сравнения сравниваются строковые представления чисел, например,
"123" будет следовать перед "4" в соответствии с порядком установленным в Unicode.
Для того, чтобы отсортировать числовые значения в порядке возрастания, или убывания нам необходимо использовать
функцию, которая задаст критерий сортировки. Рассмотрим следующий пример:
Как сортировать числа по возрастанию и убыванию
Измените значения или критерий сравнения и запустите код. Сравните порядок элементов после сортировки.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
// инициализируем переменную, содержащую массив числовых значений
var numbers = [50, 4, 33, 88, 1, 11, 123]
// сортируем массив числовых значений в порядке возрастания
console.log(numbers.sort((a, b) => a - b)) // [1, 4, 11, 33, 50, 88, 123]
// аналогично без использования стрелочной функции
console.log(
numbers.sort(function (a, b) {
return a - b
})
) // [1, 4, 11, 33, 50, 88, 123]
// сортируем массив числовых значений в порядке убывания
console.log(numbers.sort((a, b) => b - a)) // [123, 88, 50, 33, 11, 4, 1]
// аналогично без использования стрелочной функции
console.log(
numbers.sort(function (a, b) {
return b - a
})
) // [123, 88, 50, 33, 11, 4, 1]
В этом примере для сортировки числовых значений внутри массива по возрастанию и по убыванию, мы дополнительно
используем аргумент метода sort(), содержащий специальную функцию для сравнения. Она принимает два
параметра, которые определяют два текущих сравниваемых значения. Например, при сортировке по возрастанию, сравниваются
значения 50 и 4, функция вычисляет 50 - 4, и возвращает
положительное значение, в результате чего первое значение будет отсортировано после
второго.
Во втором случае, при сортировке массива по убыванию при сравнении значений 50 и 4, функция вычисляет 4 - 50, и возвращает отрицательное значение, в результате чего первое значение будет отсортировано перед вторым.
Обратите внимание, что в этом примере мы использовали стрелочные функции, они позволяют сделать код более читабельным и компактным.
Как сортировать объекты по имени и возрасту
В следующем примере мы рассмотрим, как отсортировать массив объектов по определенному свойству как по алфавиту, так и по числовому значению: Измените значения или критерий сравнения и запустите код. Сравните порядок элементов после сортировки.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
// инициализируем переменную, содержащую массив объектов
var items = [
{ name: 'Миша', age: 23 },
{ name: 'Вася', age: 44 },
{ name: 'Саша', age: 2 },
{ name: 'Рома', age: 99 },
{ name: 'Ашот', age: 19 },
]
// сортируем объекты внутри массива по свойству name (по алфавиту)
items.sort((a, b) => a.name.localeCompare(b.name, 'ru'))
console.log(items) // выводим в консоль результат сортировки
// [
// {name: "Ашот", age: 19}
// {name: "Вася", age: 44}
// {name: "Миша", age: 23}
// {name: "Рома", age: 99}
// {name: "Саша", age: 2}
// ]
// сортируем объекты внутри массива по свойству age (по возрастанию числовых значений)
items.sort((a, b) => a.age - b.age)
console.log(items) // выводим в консоль результат сортировки
// [
// {name: "Саша", age: 2}
// {name: "Ашот", age: 19}
// {name: "Миша", age: 23}
// {name: "Вася", age: 44}
// {name: "Рома", age: 99}
// ]