Сводка
Метод sort()
на месте сортирует элементы массива и возвращает отсортированный массив. Сортировка не обязательно устойчива (англ.). Порядок cортировки по умолчанию соответствует порядку кодовых точек Unicode.
Синтаксис
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; }); print(numbers);
Объекты могут быть отсортированы по значению одного из своих свойств.
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,200 numericStringArray: 80,9,700 Сортировка без функции сравнения: 700,80,9 Сортировка с функцией compareNumbers: 9,80,700 mixedNumericArray: 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é']
Пример: сортировка отображения
Функция сравнения compareFunction
может вызываться несколько раз для каждого элемента в массиве. В зависимости от природы функции сравнения, это может привести к высоким накладным расходам. Чем большую работу проделывает функции сравнения и чем больше сортируемых элементов, тем разумнее может показаться вариант с использованием сортировки отображения. Идея состоит в том, чтобы обойти массив один раз для извлечения реальных значений, используемых для сортировки во временный массив, отсортироавть временный массив, а затем обойти его и привести первоначальный массив в требуемый порядок.
// массив для сортировки var list = ['Дельта', 'альфа', 'ЧАРЛИ', 'браво']; // временное хранилище позиции и сортируемого значения var map = list.map(function(e, i) { return { index: i, value: e.toLowerCase() }; }); // сортируем карту, содержащую нормализованные значения map.sort(function(a, b) { return +(a.value > b.value) || +(a.value === b.value) - 1; }); // контейнер для результирующего порядка var result = map.map(function(e) { return list[e.index]; });
Спецификации
Спецификация | Статус | Комментарии |
---|---|---|
ECMAScript 1-е издание. | Стандарт | Изначальное определение. |
ECMAScript 5.1 (ECMA-262) Определение 'Array.prototype.sort' в этой спецификации. |
Стандарт | |
ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Array.prototype.sort' в этой спецификации. |
Стандарт |
Совместимость с браузерами
Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Базовая поддержка | 1.0 | 1.0 (1.7 или ранее) | 5.5 | (Да) | (Да) |
Возможность | Android | Chrome для Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Базовая поддержка | (Да) | (Да) | (Да) | (Да) | (Да) | (Да) |