This page was translated from English by the community.Learn more and join the MDN Web Docs community.
Array.prototype.sort()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since июль 2015 г..
Сводка
Методsort()на месте сортирует элементы массива и возвращает отсортированный массив. Сортировка не обязательноустойчива (англ.). Порядок сортировки по умолчанию соответствует порядку кодовых точек Unicode.
In this article
Синтаксис
arr.sort([compareFunction])
Параметры
compareFunctionНеобязательный параметр. Указывает функцию, определяющую порядок сортировки. Если опущен, массив сортируется в соответствии со значениями кодовых точек каждого символаUnicode, полученных путём преобразования каждого элемента в строку.
Возвращаемое значение
Отсортированный массив. Важно, что копия массива не создаётся - массив сортируетсяна месте.
Описание
Если функция сравненияcompareFunction не предоставляется, элементы сортируются путём преобразования их в строки и сравнения строк в порядке следования кодовых точек Unicode. Например, слово "Вишня" идёт перед словом "бананы". При числовой сортировке, 9 идёт перед 80, но поскольку числа преобразуются в строки, то "80" идёт перед "9" в соответствии с порядком в Unicode.
var fruit = ["арбузы", "бананы", "Вишня"];fruit.sort(); // ['Вишня', 'арбузы', 'бананы']var scores = [1, 2, 10, 21];scores.sort(); // [1, 10, 2, 21]var things = ["слово", "Слово", "1 Слово", "2 Слова"];things.sort(); // ['1 Слово', '2 Слова', 'Слово', 'слово']// В Unicode, числа находятся перед буквами в верхнем регистре,// а те, в свою очередь, перед буквами в нижнем регистре.Если функция сравненияcompareFunction предоставлена, элементы массива сортируются в соответствии с её возвращаемым значением. Если сравниваются два элементаa иb, то:
- Если
compareFunction(a, b)меньше 0, сортировка поставитaпо меньшему индексу, чемb, то есть,aидёт первым. - Если
compareFunction(a, b)вернёт 0, сортировка оставитaиbнеизменными по отношению друг к другу, но отсортирует их по отношению ко всем другим элементам. Обратите внимание: стандарт ECMAscript не гарантирует данное поведение, и ему следуют не все браузеры (например, версии Mozilla по крайней мере, до 2003 года). - Если
compareFunction(a, b)больше 0, сортировка поставитbпо меньшему индексу, чемa. - Функция
compareFunction(a, b)должна всегда возвращать одинаковое значение для определённой пары элементовaиb. Если будут возвращаться непоследовательные результаты, порядок сортировки будет не определён.
Итак, функция сравнения имеет следующую форму:
function compare(a, b) { if (a меньше b по некоторому критерию сортировки) { return -1; } if (a больше b по некоторому критерию сортировки) { return 1; } // a должно быть равным b return 0;}Для числового сравнения, вместо строкового, функция сравнения может просто вычитатьb изa. Следующая функция будет сортировать массив по возрастанию:
function compareNumbers(a, b) { return a - b;}Методsort можно удобно использовать сфункциональными выражениями (изамыканиями):
var numbers = [4, 2, 5, 1, 3];numbers.sort(function (a, b) { return a - b;});console.log(numbers); // [1, 2, 3, 4, 5]Объекты могут быть отсортированы по значению одного из своих свойств.
var items = [ { name: "Edward", value: 21 }, { name: "Sharpe", value: 37 }, { name: "And", value: 45 }, { name: "The", value: -12 }, { name: "Magnetic" }, { name: "Zeros", value: 37 },];items.sort(function (a, b) { if (a.name > b.name) { return 1; } if (a.name < b.name) { return -1; } // a должно быть равным b return 0;});Примеры
>Пример: создание, отображение и сортировка массива
В следующем примере создаётся четыре массива, сначала отображается первоначальный массив, а затем они сортируются. Числовые массивы сортируются сначала без, а потом с функцией сравнения.
var stringArray = ["Голубая", "Горбатая", "Белуга"];var numericStringArray = ["80", "9", "700"];var numberArray = [40, 1, 5, 200];var mixedNumericArray = ["80", "9", "700", 40, 1, 5, 200];function compareNumbers(a, b) { return a - b;}// снова предполагаем, что функция печати определенаconsole.log("stringArray:", stringArray.join());console.log("Сортировка:", stringArray.sort());console.log("numberArray:", numberArray.join());console.log("Сортировка без функции сравнения:", numberArray.sort());console.log( "Сортировка с функцией compareNumbers:", numberArray.sort(compareNumbers),);console.log("numericStringArray:", numericStringArray.join());console.log("Сортировка без функции сравнения:", numericStringArray.sort());console.log( "Сортировка с функцией compareNumbers:", numericStringArray.sort(compareNumbers),);console.log("mixedNumericArray:", mixedNumericArray.join());console.log("Сортировка без функции сравнения:", mixedNumericArray.sort());console.log( "Сортировка с функцией compareNumbers:", mixedNumericArray.sort(compareNumbers),);Этот пример произведёт следующий вывод. Как показывает вывод, когда используется функция сравнения, числа сортируются корректно вне зависимости от того, являются ли они собственно числами или строками с числами.
stringArray: Голубая,Горбатая,БелугаСортировка: Белуга,Голубая,ГорбатаяnumberArray: 40,1,5,200Сортировка без функции сравнения: 1,200,40,5Сортировка с функцией compareNumbers: 1,5,40,200numericStringArray: 80,9,700Сортировка без функции сравнения: 700,80,9Сортировка с функцией compareNumbers: 9,80,700mixedNumericArray: 80,9,700,40,1,5,200Сортировка без функции сравнения: 1,200,40,5,700,80,9Сортировка с функцией compareNumbers: 1,5,9,40,80,200,700
Пример: сортировка не-ASCII символов
Для сортировки строк с не-ASCII символами, то есть строк с символами акцента (e, é, è, a, ä и т.д.), строк, с языками, отличными от английского: используйтеString.localeCompare. Эта функция может сравнивать эти символы, чтобы они становились в правильном порядке.
var items = ["réservé", "premier", "cliché", "communiqué", "café", "adieu"];items.sort(function (a, b) { return a.localeCompare(b);});// items равен ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']Пример: сортировка c помощью map
Функция сравнения(compareFunction) может вызываться несколько раз для каждого элемента в массиве. В зависимости от природы функции сравнения, это может привести к высоким расходам ресурсов. Чем более сложна функция сравнения и чем больше элементов требуется отсортировать, тем разумнее использоватьmap для сортировки. Идея состоит в том, чтобы обойти массив один раз, чтобы извлечь фактические значения, используемые для сортировки, во временный массив, отсортировать временный массив, а затем обойти временный массив для получения правильного порядка.
// массив для сортировкиvar list = ["Дельта", "альфа", "ЧАРЛИ", "браво"];// временный массив содержит объекты с позицией и значением сортировкиvar mapped = list.map(function (el, i) { return { index: i, value: el.toLowerCase() };});// сортируем массив, содержащий уменьшенные значенияmapped.sort(function (a, b) { if (a.value > b.value) { return 1; } if (a.value < b.value) { return -1; } return 0;});// контейнер для результаvar result = mapped.map(function (el) { return list[el.index];});Спецификации
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-array.prototype.sort> |