Array.prototype.sort()
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Сводка
Синтаксис
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 |