Сортировка массива

Отсортировать массив позволяет метод sort([Функция сортировки]). Если функция сортировки не указана, будет выполнена обычная сортировка (числа сортируются по возрастанию, а символы — по алфавиту):

let arr = [ 'Один', 'Два', 'Три' ];
arr.sort();
console.log(arr); // [ 'Два', 'Один', 'Три' ]

Если нужно изменить стандартный порядок сортировки, это можно сделать с помощью пользовательской функции сортировки. Функция принимает две переменные и должна возвращать:

  • положительное число — если первый элемент больше второго;
  • отрицательное число — если второй элемент больше первого;
  • 0 — если элементы равны.

Например, стандартная сортировка зависит от регистра символов:

let arr = [ 'единица1', 'Единый', 'Единица2' ];
arr.sort();
console.log(arr); // [ 'Единица2', 'Единый', 'единица1' ]

В результате мы получим неправильную сортировку, ведь Единица2 и Единый должны стоять позже единица1. Изменим стандартную сортировку на свою сортировку без учета регистра (листинг 6.1).

Листинг 6.1. Сортировка без учета регистра

function cmp(str1, str2) {     // Сортировка без учета регистра
   str1 = str1.toLowerCase();  // Преобразуем к нижнему регистру
   str2 = str2.toLowerCase();  // Преобразуем к нижнему регистру
   if (str1 > str2) return 1;
   if (str1 < str2) return -1;
   return 0;
}
let arr = [ 'единица1', 'Единый', 'Единица2' ];
arr.sort(cmp);     // Имя функции указывается без скобок
console.log(arr);  // [ 'единица1', 'Единица2', 'Единый' ]

Для этого две переменные приводим к одному регистру, а затем производим стандартное сравнение. Обратите внимание, что мы не изменяем регистр самих элементов массива, т. к. работаем с их копиями.

Порядок сортировки можно изменить на противоположный (листинг 6.2), изменив возвращаемые функцией значения. В качестве примера укажем анонимную функцию вместо обычной.

Листинг 6.2. Сортировка без учета регистра в обратном порядке

let arr = [ 'единица1', 'Единый', 'Единица2' ];
arr.sort( function(str1, str2) {
   str1 = str1.toLowerCase();
   str2 = str2.toLowerCase();
   if (str1 > str2) return -1;
   if (str1 < str2) return 1;
   return 0;
});
console.log(arr);  // [ 'Единый', 'Единица2', 'единица1' ]

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов