# Метод sort()

### <mark style="background-color:orange;">Деструктивний (змінює вихідний масив)</mark>

Метод <mark style="background-color:red;">sort()</mark> використовується для сортування елементів масиву на місці (змінює порядок елементів у масиві). За замовчуванням, метод <mark style="background-color:red;">sort()</mark> впорядковує елементи у лексикографічному порядку - тобто як рядки.

**Що виконує метод**:

* Сортує і змінює вихідний масив.
* Повертає змінений масив, тобто посилання на відсортований вихідний.
* За замовчуванням сортує за зростанням.
* Сортування відбувається шляхом приведення значень до рядка і порівняння порядкових номерів у таблиці Unicode.

## Сортування чисел за зростанням (посимвольно)

```javascript
const numbers = [3, 7, 1, 9, 6];
console.log("Вихідний масив: ", numbers);
//  [3, 7, 1, 9, 6]

numbers.sort();

console.log("Вихідний масив після сортування:", numbers);
// [1, 3, 6, 7, 9]
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FYZNJfRfUdGLS3nevexqt%2Fsort1.png?alt=media&#x26;token=f2f6657b-514c-44e3-9419-2e2ced45ece2" alt="" width="375"><figcaption></figcaption></figure>

За замовчуванням значення приводяться до рядка. Тому стандартне сортування чисел працює посимвольно.&#x20;

```javascript
const numbers = [3, 7, 1, 9, 6, 10, 23, 70];
console.log("Вихідний масив: ", numbers);
//  [3, 7, 1, 9, 6, 10, 23, 70]

numbers.sort();

console.log("Вихідний масив після сортування:", numbers);
// [1, 10, 23, 3, 6, 7, 70, 9]
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FKu5JoMeXNspngUQdiREB%2Fsort2.png?alt=media&#x26;token=caf7d96c-45d4-4625-840a-27d6a4b6e721" alt="" width="375"><figcaption></figcaption></figure>

Метод спочатку відсортував по першому символу, потім по другому і тд. Нижче ми розглянемо як задавати свій порядок сортування.

## Сортування рядків за алфавітом (посимвольно)

Масив рядків метод <mark style="background-color:red;">sort()</mark> сортує за алфівітом.

```javascript
const people = ["Max", "Alex", "Helga", "Angelina", "Pablo"];
console.log("Вихідний масив: ", people);
// ['Max', 'Alex', 'Helga', 'Angelina', 'Pablo']

people.sort();

console.log("Вихідний масив після сортування:", people);
// ['Alex', 'Angelina', 'Helga', 'Max', 'Pablo']
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FBIlvGrtRfvQ3PohTfLUC%2Fsort3.png?alt=media&#x26;token=c644dbd5-c031-4c41-95c0-d3cb9f2cb270" alt="" width="375"><figcaption></figcaption></figure>

У той же час великі і малі літери метод <mark style="background-color:red;">sort()</mark> розглядає як різні символи і розташовує згідно з таблицею символів unicode. Порядковий номер великих літер менший, ніж у малих.

```javascript
const letters = ["b", "C", "d", "c", "A", "B", "D", "a"];
console.log("Вихідний масив: ", letters);
// ["b", "C", "d", "c", "A", "B", "D", "a"]

letters.sort();

console.log("Вихідний масив після сортування:", letters);
// ['A', 'B', 'C', 'D', 'a', 'b', 'c', 'd']
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FrY6cpVwuEWlIbF1WKK2u%2Fsort4.png?alt=media&#x26;token=d73b044c-8a4d-43cb-a7db-962370162541" alt="" width="375"><figcaption></figcaption></figure>

## Уникнення деструкції, чистота функції

Метод sort() змінює вихідний масив. Відтак потрібно робити копію масива перед застосуванням методу.

```javascript
const letters = ["b", "C", "d", "c", "A", "B", "D", "a"];
console.log("Вихідний масив: ", letters);
// ["b", "C", "d", "c", "A", "B", "D", "a"]

const sortedLetters = [...letters].sort();

console.log("Вихідний масив після сортування:", letters);
// ["b", "C", "d", "c", "A", "B", "D", "a"]

console.log("Новий відсортований масив:", sortedLetters);
// ['A', 'B', 'C', 'D', 'a', 'b', 'c', 'd']
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FwNlzWOhlucGBRMGNp5yi%2Fsort5.png?alt=media&#x26;token=1f0dc21f-aef6-4188-835c-e4999fffdfdc" alt="" width="375"><figcaption></figcaption></figure>

## Сортування чисел за арифметичним зростанням і спаданням

Щоб сортування за зростанням чи спаданням відбувалось по арифметичним правилам у метод <mark style="background-color:red;">sort()</mark> передають колбек-функцію порівняння (compare function) з двома параметрами. Від результату цієї функції буде залежати порядок сортування.

**Синтаксис:**

```javascript
array.sort((a, b) => {
  // Тіло колбек-функції
});
```

**a** - перший елемент для порівняння.

**b** - другий елемент для порівняння.

### Сортування за арифметичним зростанням

Якщо виклик колбек функції повертає відʼємне значення тобто a < b, сортування поставить a перед b. Це буде сортування за зростанням.

```javascript
const numbers = [3, 7, 1, 9, 6, 10, 23, 70];
console.log("Вихідний масив: ", numbers);
//  [3, 7, 1, 9, 6, 10, 23, 70]

numbers.sort((a, b) => {
  return a - b;
});

console.log("Вихідний масив після сортування:", numbers);
// [1, 3, 6, 7, 9, 10, 23, 70]
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FqPG9NsoUQuq6c9Wh1Wwg%2Fsort6.png?alt=media&#x26;token=ce368fb2-b4c9-4560-887f-b18a003db925" alt="" width="375"><figcaption></figcaption></figure>

Для спрощення запису можна використвувати неявне повернення.

### Сортування за арифметичним спаданням

Якщо виклик колбек функції повертає будь-яке додатне значення більше нуля, тобто b > a, сортування поставить b перед a. Тобто це - сортування за спаданням.

```javascript
const numbers = [3, 7, 1, 9, 6, 10, 23, 70];
console.log("Вихідний масив: ", numbers);
//  [3, 7, 1, 9, 6, 10, 23, 70]

numbers.sort((a, b) => b - a);

console.log("Вихідний масив після сортування:", numbers);
// [70, 23, 10, 9, 7, 6, 3, 1]
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FMQPZQhkSA77gVpFK3TYh%2Fsort7.png?alt=media&#x26;token=84dff2f2-08ee-4f94-ad41-88d7462018ec" alt="" width="375"><figcaption></figcaption></figure>

Якщо виклик колбек функції повертає 0, сортування залишить a і b незмінними по відношенню один до одного, але відсортує їх по відношенню до всіх інших елементів.&#x20;

## Сортування рядків (регістронезалежне)

Вище ми розглянули сортування масиву рядків за алфавітом, але малі літери при цьому виносилися ніби окремим алфавітом після великих літер. Цей ефект усуває використання в методі <mark style="background-color:red;">sort()</mark> колбек функції із методом рядків <mark style="background-color:red;">localeCompare()</mark>.

```javascript
firstString.localeCompare(secondString)
```

Метод  <mark style="background-color:red;">localeCompare()</mark> викликається на рядку, який треба порівняти (firstString)  і як аргумент йому в круглих дужках передають другий рядок (secondString).

```javascript
"a".localeCompare("b"); // -1
"b".localeCompare("a"); // 1
"a".localeCompare("a"); // 0
"b".localeCompare("b"); // 0
```

* Повертає від'ємне значення, якщо <mark style="background-color:red;">firstString</mark> повинен бути перед <mark style="background-color:red;">secondString</mark>.
* Повертає додатне значення більше нуля, якщо <mark style="background-color:red;">firstString</mark> повинен бути після <mark style="background-color:red;">secondString</mark>.
* Якщо рядки однакові, повертається нуль.

Це зручно використовувати для сортування рядків, оскільки метод <mark style="background-color:red;">sort()</mark> очікує такі самі значення від колбек-функції.

```javascript
const letters = ["b", "C", "d", "c", "A", "B", "D", "a"];
console.log("Вихідний масив: ", letters);
// ["b", "C", "d", "c", "A", "B", "D", "a"]

letters.sort((a, b) => a.localeCompare(b));

console.log("Вихідний масив після сортування:", letters);
// ['a', 'A', 'b', 'B', 'c', 'C', 'd', 'D']
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FWe5OVPUWFtZTN8zmiaka%2Fsort8.png?alt=media&#x26;token=2e4964b8-e020-4320-b736-017d4bc0dd6e" alt="" width="367"><figcaption></figcaption></figure>

### Сортування за алфавітом і в зворотньому порядку

Відсортуємо згідно з вказаними правилами масив рядків в алфавітоному і зворотному порядку.

```javascript
const people = ["Max", "Alex", "Helga", "Angelina", "Pablo"];
console.log("Вихідний масив: ", people);
// ['Max', 'Alex', 'Helga', 'Angelina', 'Pablo']

const alphabetSort = [...people].sort((a, b) => a.localeCompare(b));
const reverseSort = [...people].sort((a, b) => b.localeCompare(a));

console.log("Вихідний масив після сортування:", people);
// ['Max', 'Alex', 'Helga', 'Angelina', 'Pablo']

console.log("Алфавітне сортування:", alphabetSort);
// ['Alex', 'Angelina', 'Helga', 'Max', 'Pablo']

console.log("Реверсне сортування:", reverseSort);
// ['Pablo', 'Max', 'Helga', 'Angelina', 'Alex']
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FHrCVnWCImXbwpw9hFzDq%2Fsort9.png?alt=media&#x26;token=9b908636-c1b2-4b67-aa47-f133324b52d2" alt="" width="375"><figcaption></figcaption></figure>

## **Сортування об'єктів**

За описпними вище принципами можна сортувати масиви обʼєктів. Відсортуємо нижченаведений масив обʼєктів за зростанням віку, спаданням віку і за алфавітом.

```javascript
const people = [
  { name: "Alex", age: 18 },
  { name: "Max", age: 67 },
  { name: "Helga", age: 14 },
  { name: "Mathew", age: 36 },
  { name: "Angelina", age: 59 },
  { name: "Pablo", age: 7 },
  { name: "Paolina", age: 61 },
];
console.log(people); // вихідний масив

const olderPeople = [...people].sort((a, b) => a.age - b.age);
console.log(olderPeople); // від молодших до старших

const youngerPeople = [...people].sort((a, b) => b.age - a.age);
console.log(youngerPeople); // від старших до молодших

const alphabetPeople = [...people].sort((a, b) => a.name.localeCompare(b.name));
console.log(alphabetPeople); // за алфавітом
```

<figure><img src="https://2207544843-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnGZ6aKsaRNTtzzpVD8b0%2Fuploads%2FHFZNXKnDjEGcMyiNsbpq%2Fsort10.png?alt=media&#x26;token=5a7d7750-f069-4fd9-8142-d3f5f5ea9712" alt="" width="375"><figcaption></figcaption></figure>
