Skip to content

Commit

Permalink
update(JS): web/javascript/reference/global_objects/array/sort/index.md
Browse files Browse the repository at this point in the history
  • Loading branch information
viperehonchuk authored and AdriandeCita committed Jan 23, 2022
1 parent 4ab8160 commit 882e74f
Showing 1 changed file with 41 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,38 @@ tags:
- Polyfill
browser-compat: javascript.builtins.Array.sort
---

{{JSRef}}

Метод **`sort()`** сортує елементи масиву _[на місці](https://en.wikipedia.org/wiki/In-place_algorithm)_ й повертає відсортований масив. Усталений порядок сортування — в порядку зростання, заснований на перетворенні елементів у рядки, а потім порівнянні їхніх послідовностей зі значень кодів UTF-16.

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

{{EmbedInteractiveExample("pages/js/array-sort.html")}}

## Синтаксис

```js
// Без функції порівняння
sort()
sort();

// Стрілкова функція
sort((firstEl, secondEl) => { /* ... */ } )
sort((firstEl, secondEl) => {
/* ... */
});

// Функція порівняння
sort(compareFn)
sort(compareFn);

// Функція порівняння, оголошена на місці
sort(function compareFn(firstEl, secondEl) { /* ... */ })
sort(function compareFn(firstEl, secondEl) {
/* ... */
});
```

### Параметри

- `compareFunction` {{optional_inline}}
- `compareFn` {{optional_inline}}

- : Задає функцію, яка визначатиме порядок сортування. В разі, якщо вона опущена, елементи масиву перетворюються в рядки, і потім сортуються відносно значення юнікодного коду кожного символу.

Expand All @@ -48,18 +53,18 @@ sort(function compareFn(firstEl, secondEl) { /* ... */ })

### Повернене значення

Відсортований масив. Зауважте, що масив сортується _[на місці](https://en.wikipedia.org/wiki/In-place_algorithm)_, і ніяких додаткових копій не створюється.
Відсортований масив. Зауважте, що масив сортується _[на місці](https://en.wikipedia.org/wiki/In-place_algorithm)_: ніяких додаткових копій не створюється.

## Опис

Якщо `compareFunction` передано не було, всі елементи масиву, котрі не є `undefined`, сортуються шляхом перетворення їх у рядки, і порівняння цих рядків в порядку кодів UTF-16. Наприклад, "банан" йде перед "черешнею". У разі сортування чисел, 9 йде перед 80, але через те, що числа перетворюються в рядки перед сортуванням, "80" йде перед "9" згідно з послідовністю кодів Unicode. Всі елементи, які є `undefined`, складаються в кінець масиву.
Якщо `compareFunction` передано не було, всі елементи масиву, котрі не є `undefined`, сортуються шляхом перетворення їх на рядки та порівняння цих рядків в порядку кодів UTF-16. Наприклад, "банан" йде перед "черешнею". У разі сортування чисел9 йде перед 80, але через те, що числа перетворюються на рядки перед сортуванням, "80" йде перед "9" згідно з послідовністю кодів Unicode. Всі елементи, які є `undefined`, складаються в кінець масиву.

> **Зауваження:** В UTF-16, символи юнікоду вище `\uFFFF` кодуються як сурогатні пари кодів з проміжку `\uD800`-`\uDFFF`. Під час порівняння значення кожного коду такої пари враховується окремо. Таким чином, символ, сформований сурогатною парою `\uD855\uDE51`, під час сортування опиниться перед символом `\uFF3A`.
> **Зауваження:** В UTF-16 символи юнікоду вище `\uFFFF` кодуються як сурогатні пари кодів з проміжку `\uD800`-`\uDFFF`. Під час порівняння значення кожного коду такої пари враховується окремо. Таким чином, символ, сформований сурогатною парою `\uD855\uDE51`, під час сортування опиниться перед символом `\uFF3A`.
Якщо було передано функцію порівняння `compareFunction`, всі елементи масиву, котрі не є `undefined`, сортуються відповідно поверненого значення функції порівняння (всі елементи, які містять `undefined`, складаються в кінець масиву без викликання `compareFunction`).

| Повернене значення `compareFunction(a, b)` | Порядок сортування |
|--------------------------------------------|---------------------------------------|
| ------------------------------------------ | ------------------------------------- |
| > 0 | сортує `b` перед `a` |
| < 0 | сортує `a` перед `b` |
| === 0 | зберігає початковий порядок `a` і `b` |
Expand Down Expand Up @@ -89,11 +94,11 @@ function compareNumbers(a, b) {
}
```

Метод `sort` можна зручно використовувати з {{jsxref("Operators/function", "функційними виразами", "", 1)}}:
Метод `sort` можна зручно використовувати з {{jsxref("Operators/function", "виразами функцій", "", 1)}}:

```js
var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
numbers.sort(function (a, b) {
return a - b;
});
console.log(numbers);
Expand All @@ -120,7 +125,7 @@ var items = [
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic', value: 13 },
{ name: 'Zeros', value: 37 }
{ name: 'Zeros', value: 37 },
];

// сортувати за властивістю value
Expand All @@ -129,7 +134,7 @@ items.sort(function (a, b) {
});

// сортувати за властивістю name
items.sort(function(a, b) {
items.sort(function (a, b) {
var nameA = a.name.toUpperCase(); // ігноруємо малі та великі літери
var nameB = b.name.toUpperCase(); // ігноруємо малі та великі літери
if (nameA < nameB) {
Expand All @@ -151,7 +156,7 @@ items.sort(function(a, b) {
Наступний приклад створює чотири масиви, далі показує вихідний масив, а потім<span class="x x-first x-last"> —</span> відсортовані масиви. Числові масиви сортуються спочатку без функції сортування, а потім із нею.

```js
let stringArray = ['Blue', 'Humpback', 'Beluga'];
let stringArray = ['Кит синій', 'Горбатий кит', 'Білуга'];
let numericStringArray = ['80', '9', '700'];
let numberArray = [40, 1, 5, 200];
let mixedNumericArray = ['80', '9', '700', 40, 1, 5, 200];
Expand All @@ -160,8 +165,8 @@ function compareNumbers(a, b) {
return a - b;
}

stringArray.join(); // 'Blue,Humpback,Beluga'
stringArray.sort(); // ['Beluga', 'Blue', 'Humpback']
stringArray.join(); // 'Кит синій,Горбатий кит,Білуга'
stringArray.sort(); // ['Білуга', 'Горбатий кит', 'Кит синій']

numberArray.join(); // '40,1,5,200'
numberArray.sort(); // [1, 200, 40, 5]
Expand Down Expand Up @@ -195,12 +200,12 @@ items.sort(function (a, b) {

```js
// масив, який треба відсортувати
const data = ['delta', 'alpha', 'charlie', 'bravo'];
const data = ['Григорій', 'Анна', 'Василь', 'Богдан'];

// тимчасовий масив містить об'єкти з позицією елемента в оригінальному масиві, і значенням для сортування
const mapped = data.map((v, i) => {
return { i, value: someSlowOperation(v) };
})
});

// сортуємо тимчасовий масив, що містить уже обраховані значення
mapped.sort((a, b) => {
Expand All @@ -213,7 +218,7 @@ mapped.sort((a, b) => {
return 0;
});

const result = mapped.map(v => data[v.i]);
const result = mapped.map((v) => data[v.i]);
```

Існує опенсорсна бібліотека [mapsort](https://null.house/open-source/mapsort), котра реалізовує такий підхід.
Expand All @@ -222,14 +227,14 @@ const result = mapped.map(v => data[v.i]);

Починаючи з версії 10 (або EcmaScript 2019), [специфікація](https://tc39.es/ecma262/#sec-array.prototype.sort) постулює, що `Array.prototype.sort` дає стабільне сортування.

Для прикладу, скажімо, в нас є список студентів з їхніми оцінками. Зауважте, що цей список вже відсортований за іменами в алфавітному порядку:
Для прикладу, скажімо, є список студентів з їхніми оцінками. Зауважте, що цей список вже відсортований за іменами в алфавітному порядку:

```js
const students = [
{ name: "Alex", grade: 15 },
{ name: "Devlin", grade: 15 },
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
{ name: 'Артур', grade: 13 },
{ name: 'Олексій', grade: 15 },
{ name: 'Рустем', grade: 15 },
{ name: 'Самійло', grade: 14 },
];
```

Expand All @@ -243,23 +248,24 @@ students.sort((firstItem, secondItem) => firstItem.grade - secondItem.grade);

```js
[
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
{ name: "Alex", grade: 15 }, // збережено первісне сортування для однакових оцінок (стабільше сортування)
{ name: "Devlin", grade: 15 }, // збережено первісне сортування для однакових оцінок (стабільше сортування)
{ name: 'Артур', grade: 13 },
{ name: 'Самійло', grade: 14 },
{ name: 'Олексій', grade: 15 }, // збережено первісне сортування для однакових оцінок (стабільше сортування)
,
{ name: 'Рустем', grade: 15 }, // збережено первісне сортування для однакових оцінок (стабільше сортування)
];
```

Важливо зауважити, що студенти, які мають однакові оцінки (для прикладу, Alex та Devlin), залишаться в тому ж порядку, що й перед сортуванням. Це те, що гарантує алгоритм стабільного сортування.
Важливо зауважити, що студенти, які мають однакові оцінки (для прикладу, Олексій та Рустем), залишаться в тому ж порядку, що й перед сортуванням. Це те, що гарантує алгоритм стабільного сортування.

До версії 10 (чи EcmaScript 2019), стабільність сортування не гарантувалась, тобто могла трапитись наступна ситуація:
До версії 10 (чи EcmaScript 2019) стабільність сортування не гарантувалась, тобто могла трапитись наступна ситуація:

```js
[
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
{ name: "Devlin", grade: 15 }, // первісне сортування не збережено
{ name: "Alex", grade: 15 }, // первісне сортування не збережено
{ name: 'Артур', grade: 13 },
{ name: 'Самійло', grade: 14 },
{ name: 'Рустем', grade: 15 }, // первісне сортування не збережено
{ name: 'Олексій', grade: 15 }, // первісне сортування не збережено
];
```

Expand Down

0 comments on commit 882e74f

Please sign in to comment.