Сортировка массива на JS
Метод sort часто используется для сортировки массивов в JS, но необходимо знать о некоторых нюансах при работе с данным методом. Все дело в том, что по умолчанию метод sort сортирует элементы массива как строки, даже в том случае, когда массив состоит из чисел. В результате, числовой массив будет отсортирован неправильно. У начинающих изучать JavaScript, такое поведение, вызывает недоумение и вопросы. Где здесь подвох? Давайте разбираться.
Сортировка строк в массиве по алфавиту?
На первый взгляд может показаться, что строки сортируются в алфавитном порядке, но на самом деле это не так. Они сортируются по значениям ASCII-коду и сравниваются по первому символу. Что будет больше "b" или "aaaaa"? Больше будет "b", поскольку в сравнении участвуют только первые символы, напиши хоть 10 раз букву "a", но код символа "b" больше кода символа "a".
Что будет, когда у сравниваемых элементов одинаковые первые символы? В таком случае, сравнение будет идти по вторым символам. Если код символа "c" больше кода символа "b", значит буква "с" больше буквы "b".
let arr2 = ['ac', 'ab', 'aa'];
arr2.sort();
console.log(arr2); // ["aa", "ab", "ac"]
Сортировка чисел массива по возрастанию
Обратите внимание на важную деталь - метод sort изменяет текущий массив и кроме того возвращает уже отсортированный массив. Иными словами, оригинал не отсортированного массива после отработки метода sort, больше не сущестует.
Отсортируем числовой массив по возрастанию и результат выведем в консоль. Мы видим, что массив отсортирован неверно. Если знать, как метод sort сравнивает между собой числа, то все встанет на свои места. А сравнивает он их в лексикографическом порядке. Это значит, что числа сравниваются как строки, а не как числа. Они сравниваются по первому символу. У чисел 1, 14, 144 первый символ "1", раз по первому символу они равны, то борьба переходит между следующими символами - "14" больше "1" и меньше чем "144".
let arr = [6, 4, 14, 5, 144, 9, 1];
arr.sort();
console.log(arr); // неправильная сортировка [1, 14, 144, 4, 5, 6, 9]
Алгоритм для сортировки чисел по возрастанию
Как выйти из этого положения и сортировать числа правильно? Нужна задать свои правила, каким образом сравнивать между собой числа, написав небольшую функцию. Метод sort принимает функцию с двумя параметрами, в которые попадают пары чисел. Два числа сравниваются между собой по формуле a-b. Возьмем первую пару "6, 4" и подставим их в формулу "6-4=2", если результат положительный, то значит "6 > 4". Тогда меняем их местами в массиве "4, 6". Дальше переходим ко второй паре "4, 14", делаем вычисления "4-14=-10". Отрицательный результат, говорит нам о том, что "4 < 14", числа остаются на месте. Сравнивание будет происходить до тех пор, пока у всех пар результат вычитания, даст отрицательный результат.
const array = [6, 4, 14, 5, 144, 9, 1];
const bubble = array.sort((a, b) => a-b);
console.log(bubble); // правильная сортировка [1, 4, 5, 6, 9, 14, 144]
Рассмотренный выше алгоритм сортировки, называется "Сортировка пузырьком - Bubble sort". При каждом проходе два числа пары сравниваются между собой, чтобы определить нужна перестановка или нет. На втором проходе по массиву самое большое число оказалось последним в массиве. Это похоже на всплытие "пузырька" снизу вверх. Потребуется сделать много проходов по массиву, пока числа не прекратят перестановку. Если числа больше не переставляются, значит массив отсортирован.
6, 4, 14, 5, 144, 9, 1 // 1-ый проход
4, 6, 5, 14, 9, 1, 144 // 2-ой проход
4, 5, 6, 9, 14, 1, 144
4, 5, 6, 9, 1, 14, 144
4, 5, 6, 1, 9, 14, 144
4, 5, 1, 6, 9, 14, 144
4, 1, 5, 6, 9, 14, 144 // 7-ой проход
1, 4, 5, 6, 9, 14, 144 // массив отсортирован
Сортировка чисел в порядке убыванию
const array2 = [6, 4, 14, 5, 144, 9, 1];
const newArray2 = array2.sort((a, b) => b-a); // меняем местами "a" и "b"
console.log(newArray2); // [144, 14, 9, 6, 5, 4, 1]
Сортировка массива объектов
Внутри массива находятся объекты. С помощью метода sort можно сделать сортировку по ключу age. Добавим название нужного поля к параметрам "a, b".
const array3 = [
{age: 15, name: 'Arina'},
{age: 17, name: 'Misha'},
{age: 12, name: 'Lena'},
];
const newArray3 = array3.sort((a, b) => a.age-b.age);
console.log(array3);
-
- Михаил Русаков
Комментарии (1):
А как отсортировать объект по ключу name??
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.