JavaScript метод sort()

Определение и применение

JavaScript метод sort() сортирует массив на месте. По умолчанию он сравнивает строковые представления элементов по кодовым единицам UTF-16. Это не числовая и не языковая алфавитная сортировка; свой порядок задаёт функция сравнения. Работу метода показывает пример «Как сортировать латинские буквы в двух направлениях».

Поддержка браузерами

Спецификация: ecma262

Поддерживается во всех основных браузерах с 2015 года.

Показать браузеры
Совместимостьjavascript.builtins.Array.sort
ВозможностьКомпьютерыМобильные
ChromeEdgeFirefoxOperaSafariChrome AndroidFirefox for AndroidOpera AndroidSafari on iOSSamsung BrowserWebView AndroidWebView on iOS
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 синтаксис

JavaScript
array.sort();
array.sort(compareFunction);

Спецификация

ECMAScript: Array.prototype.sort.

Значения параметров

Параметры sort()
Параметр Описание
compareFunction Функция, определяющая порядок сортировки элементов массива. Если функция сравнения используется (необязательный параметр), то должна возвращать одно из следующих значений:
  • Отрицательное значение, если первый переданный аргумент меньше второго аргумента. В этом случае первый сравниваемый элемент будет расположен по меньшему индексу, чем второй.
  • Ноль, если аргументы эквивалентны. Сравниваемые элементы массива останутся неизменными по отношению друг к другу, но будут отсортированы по отношению ко всем другим элементам.
  • Положительное значение, если первый аргумент больше второго аргумента. В этом случае второй сравниваемый элемент будет расположен по меньшему индексу, чем первый.

Например, для обычного сравнения чисел функцию можно записать так:

JavaScript
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
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
// инициализируем переменную, содержащую массив строковых значений
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
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
// инициализируем переменную, содержащую массив строковых значений
var arr = ['b', 'n', 'a', 'z', 'm', , 'y', , 'c']

// сортируем массив в порядке следования кодовых единиц UTF-16
console.log(arr.sort()) // ["a", "b", "c", "m", "n", "y", "z",,,] два пустых  значения в конце массива

Почему сортировка чисел по умолчанию не числовая

В следующем примере мы рассмотрим порядок числовых значений при сортировке без функции сравнения: Измените значения или критерий сравнения и запустите код. Сравните порядок элементов после сортировки.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
// инициализируем переменную, содержащую массив числовых значений
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
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
// инициализируем переменную, содержащую массив числовых значений
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
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
// инициализируем переменную, содержащую массив объектов
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}
// ]