Давайте рассмотрим несколько примеров, чтобы лучше понять, как работает метод sort, и выяснить, как localeCompare может помочь, если стандартная сортировка не подходит.
Представим массив:
const animals = ['Медведь', 'Ёжик', 'Белка'];
Применим sort и посмотрим результат:
console.log(animals.sort()); // [ 'Ёжик', 'Белка', 'Медведь' ]
На первый взгляд, результат кажется странным. Почему 'Ёжик' оказался в начале?
Всё дело в том, что метод sort использует порядок Unicode, а в Unicode буква 'Ё' идёт до всех заглавных букв. Это не соответствует правилам русского языка, где 'Ё' идёт следом за 'Е'.
Теперь возьмём массив чисел, записанных как строки:
const numbers = ['12', '11', '2'];
Применим sort:
console.log(numbers.sort()); // ['11', '12', '2']
Почему '2' оказалось в конце? Потому что sort сравнивает элементы как строки, а не как числа. Символ '2' в алфавитном порядке идёт после '1', поэтому результат выглядит некорректным для чисел.
Окей, исправим это с помощью кастомной функции сравнения:
console.log(numbers.sort((a, b) => a - b)); // ['2', '11', '12']
Теперь всё работает как ожидалось, но только для чисел.
А если нужна локализация?
Методы выше могут подойти для простых случаев, но что, если нужно учитывать особенности языка? Например, сортировать буквы по правилам русского алфавита или корректно обрабатывать строки с числами?
Здесь на помощь приходит localeCompare. Основной материал отобразила на изображениях.
console.log(animals.sort((a, b) => a.localeCompare(b))); // ['Белка', 'Ёжик', 'Медведь']
Как итог, если вы работаете с простыми строками и числами, sort может быть достаточным. Но как только появляются нюансы локализации или строки с числами, лучше использовать localeCompare.
Полезный материал: