Переклад не закінчено. Будь ласка, допоможіть перекласти цю статтю з англійської.

Метод sort() відсортовує елементи масиву на місці та повертає відсортований масив. За замовчуванням порядок сортування будується на перетворенні елементів у рядки, а потім на порівнянні іхньої послідовності значень кодових одиниць UTF-16.

Часова та просторова складність такого сортування не може гарантуватися, оскільки вона залежить від реалізації.

Синтаксис

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

Сумісність з браузерами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
sortChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 5.5Opera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Дивиться також

Мітки документа й учасники

Зробили внесок у цю сторінку: Dariaki
Востаннє оновлена: Dariaki,