Сортировка: sort()
Метод sort() сортирует массив. В отличие от filter() и map(), он не создаёт новый массив. Он сортирует сам массив:
const names = ["Лео", "Пип", "Бим", "Гоша"];
names.sort();
console.log(names);["Бим", "Гоша", "Лео", "Пип"]С числами, правда, вас ждёт сюрприз:
const scores = [10, 9, 1];
scores.sort();
console.log(scores);[1, 10, 9]Всё потому, что sort() сравнивает элементы как строки, символ за символом, как слова в словаре. Строка "10" начинается с "1", поэтому она идёт раньше, чем "9". Чтобы отсортировать числа, передайте sort() функцию сравнения:
scores.sort((a, b) => a - b);
console.log(scores);[1, 9, 10]sort() вызывает функцию сравнения снова и снова, каждый раз с двумя элементами, a и b. Результат подсказывает, какой из двух должен идти первым: если он отрицательный, то a; если положительный, то b; а если 0, они остаются как есть. Разность a - b отрицательна, когда a меньше, так что меньшие числа идут первыми. Чтобы первым шло наибольшее, поменяйте их местами: (a, b) => b - a.
Функция сравнения может сортировать и объекты по одному из их свойств. Строки сравнивают с помощью localeCompare(): a.localeCompare(b) отрицательно, если a стоит в алфавите раньше b, и положительно, если позже, точно как a - b с числами:
animals.sort((a, b) => a.age - b.age);
console.log(animals.map((animal) => animal.name));
animals.sort((a, b) => a.name.localeCompare(b.name));
console.log(animals.map((animal) => animal.name));["Пип", "Гоша", "Лео", "Бим"]
["Бим", "Гоша", "Лео", "Пип"]Почему бы не использовать для строк обычный sort()? Он сортирует по кодам символов, поэтому все заглавные буквы идут раньше всех строчных: ["ева", "Зоя", "Анна"].sort() даёт ["Анна", "Зоя", "ева"]. А localeCompare() сортирует так, как это делают люди: Анна, ева, Зоя. К тому же он умеет сортировать объекты, а обычный sort() — нет.
Типичная ошибка — вычитать строки: a.name - b.name даёт NaN (Not a Number, «не число»), и массив остаётся в прежнем порядке.
Задание
- 1
Отсортируйте
timesот самого быстрого времени, то есть от наименьшего числа, и выведите массив:[49, 58, 62, 71, 105]. - 2
Ниже отсортируйте
runnersпо времени, от самого быстрого, и выведите их имена в этом порядке через запятую:Финиш: Маша, Тимур, Зоя, Алиса, Никита. - 3
Наконец, отсортируйте
runnersпо именам с помощьюlocaleCompare()и выведите имена в алфавитном порядке:Бегуны: Алиса, Зоя, Маша, Никита, Тимур.