Метод sort()
відсортовує елементи масиву на місці та повертає відсортований масив. За замовчуванням порядок сортування будується на перетворенні елементів у рядки, а потім на порівнянні іхньої послідовності значень кодових одиниць UTF-16.
Часова та просторова складність такого сортування не може гарантуватися, оскільки вона залежить від реалізації.
Джерело цього інтерактивного прикладу зберігається у репозіторії на GitHub. Якщо ви бажаєте залучитися до проекту зі створення інтерактивних прикладів, будь ласка, скопіюйте це посилання https://github.com/mdn/interactive-examples та надішліть нам pull request.
Синтаксис
arr.sort([compareFunction])
Параметри
compareFunction
Optional- Вказує функцію, яка визначає порядок сортування. Якщо не вказувати, елементи масиву будуть перетворені на рядки, а потім відсортовані згідно до значення кодових точок Unicode кожного символу.
-
firstEl
- Перший елемент для порівняння.
secondEl
- Другий елемент для порівняння.
Повернене значення
Відсортований масив. Зверніть увагу на те, що масив сортується на місці, без створення копії.
Опис
Якщо compareFunction
не передається, усі визначені (non-undefined
) елементи масиву відсортовуються через перетворення у рядки та порівняння цих рядків в UTF-16 порядку кодових точок. Наприклад, "banana" іде перед "cherry". У числовому сортуванні, 9 іде перед 80, але оскільки числа перетворюються на рядки, "80" ідє перед "9" в Unicode порядку. Усі undefined
елементи відсортуються у кінець масиву.
Примітка : В UTF-16, Unicode символи вище за \uFFFF
кодуються як дві сурогатні кодові одиниці, діапазону \uD800
-\uDFFF
. Значення кожної кодової одиниці враховується для порівняння окремо. Таким чином, символ створений сурогатною парою \uD655\uDE55
буде відсортований перед символом \uFF3A
.
Якщо compareFunction
передається, усі визначені (non-undefined)
елементи масиву відсортовуються згідно до поверненого значення функції порівняння (усі undefined
елементи масиву відсортовуються у кінець масиву, без виклику 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
(тобтоb
іде першим). compareFunction(a, b)
завжди повинна повертати теж саме значення для певної пари елементівa
таb
, що служать у якості її двух аргументів. Якщо будуть повертатися непослідовні результати, порядок сортування буде невизначеним.
Таким чином, функція порівняння має наступний вигляд:
function compare(a, b) { if (a is less than b by some ordering criterion) { return -1; } if (a is greater than b by the ordering criterion) { return 1; } // a must be equal to b return 0; }
Для того, щоб порівняти числа замість рідків, функція порівняння може просто відняти b
з a
. Наступна функція відсортовує масив у порядку зростання (якщо тільки вона не містить Infinity
та NaN
):
function compareNumbers(a, b) { return a - b; }
Метод sort
зручно використовувати з function expressions:
var numbers = [4, 2, 5, 1, 3]; numbers.sort(function(a, b) { return a - b; }); console.log(numbers); // [1, 2, 3, 4, 5]
ES2015 надає arrow function expressions за допомогою навіть коротшого синтаксису.
let numbers = [4, 2, 5, 1, 3]; numbers.sort((a, b) => 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', value: 13 }, { name: 'Zeros', value: 37 } ]; // sort by value items.sort(function (a, b) { return a.value - b.value; }); // sort by name items.sort(function(a, b) { var nameA = a.name.toUpperCase(); // ignore upper and lowercase var nameB = b.name.toUpperCase(); // ignore upper and lowercase if (nameA < nameB) { return -1; } if (nameA > nameB) { return 1; } // names must be equal return 0; });
Приклади
Створення, відображення, та сортування масиву
У наступному прикладі створюються чотири масиви і відображаються спершу початковий, потім відсортованний масиви. Числові масиви сортуються без функції порівняння, а відсортовані потім - з нею.
var stringArray = ['Blue', 'Humpback', 'Beluga']; 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('Sorted:', stringArray.sort()); console.log('numberArray:', numberArray.join()); console.log('Sorted without a compare function:', numberArray.sort()); console.log('Sorted with compareNumbers:', numberArray.sort(compareNumbers)); console.log('numericStringArray:', numericStringArray.join()); console.log('Sorted without a compare function:', numericStringArray.sort()); console.log('Sorted with compareNumbers:', numericStringArray.sort(compareNumbers)); console.log('mixedNumericArray:', mixedNumericArray.join()); console.log('Sorted without a compare function:', mixedNumericArray.sort()); console.log('Sorted with compareNumbers:', mixedNumericArray.sort(compareNumbers));
Цей приклад буде мати наступний вивід. Згідно до нього, при використанні функції порівняння, числа сортуються належним чином, як самі числа, так і рядки з числами.
stringArray: Blue,Humpback,Beluga Sorted: Beluga,Blue,Humpback numberArray: 40,1,5,200 Sorted without a compare function: 1,200,40,5 Sorted with compareNumbers: 1,5,40,200 numericStringArray: 80,9,700 Sorted without a compare function: 700,80,9 Sorted with compareNumbers: 9,80,700 mixedNumericArray: 80,9,700,40,1,5,200 Sorted without a compare function: 1,200,40,5,700,80,9 Sorted with 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 is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']
Сортування за допомогою функції map()
Функція compareFunction
може викликатися багато разів на елемент всередені масиву. В залежності від характеру compareFunction
, це може призводити до високих накладних витрат. Чим більше роботи виконує compareFunction
, чим більше елементів їй треба відсортувати, тим доцільнішим буде використання функції map задля цієї задачі. Map() працює наступним чином: функція перебирає масив лише один раз, потім вона перетягує фактичні значення для сортування у тимчасовий масив, відсортовує цей масив, а потім перебирає його для того, щоб досягти правильного порядку.
// the array to be sorted var list = ['Delta', 'alpha', 'CHARLIE', 'bravo']; // temporary array holds objects with position and sort-value var mapped = list.map(function(el, i) { return { index: i, value: el.toLowerCase() }; }) // sorting the mapped array containing the reduced values mapped.sort(function(a, b) { if (a.value > b.value) { return 1; } if (a.value < b.value) { return -1; } return 0; }); // container for the resulting order var result = mapped.map(function(el){ return list[el.index]; });
У відкритому доступі є бібліотека під назвою mapsort, яка застосовує цей підхід.
Специфікація
Специфікація | Статус | Коментар |
---|---|---|
ECMAScript 1st Edition (ECMA-262) | Standard |
Початкове визначення. |
ECMAScript 5.1 (ECMA-262) The definition of 'Array.prototype.sort' in that specification. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Array.prototype.sort' in that specification. |
Standard | |
ECMAScript Latest Draft (ECMA-262) The definition of 'Array.prototype.sort' in that specification. |
Draft |
Сумісність з браузерами
Desktop | Mobile | Server | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
sort | Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | IE Full support 5.5 | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support 18 | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes |
Stable sorting | Chrome Full support 70 | Edge No support No | Firefox Full support 3 | IE No support No | Opera ? | Safari ? | WebView Android Full support 70 | Chrome Android Full support 70 | Firefox Android Full support 4 | Opera Android ? | Safari iOS ? | Samsung Internet Android Full support 10.0 | nodejs Full support 12.0.0 |
Legend
- Full support
- Full support
- No support
- No support
- Compatibility unknown
- Compatibility unknown