JavaScript: конструктор сортировщиков
зачем нужен конструктор сортировщиков в JavaScript
В JavaScript есть объект Intl.Collator
, называемый конструктором сортировщиков. Для чего он нужен и каковы особенности его использования?
let words = ["apple", "zebrs", "America", "Boston", "bloom"];
console.log(words.sort(new Intl.Collator("en").compare));
console.log(words.sort());
Какой результат выведет консоль после исполнения такого кода, в чем различия двух сортировок?
Для начала разберемся, что за объект Intl.Collator
и какова его роль в JavaScript?
Объект Intl.Collator
позволяет сравнивать строки с учетом языковых особенностей указанной страны.
Обычно в JavaScript сравнение строк происходит посимвольно в кодировке ASCII. Таким образом при сортировке по возрастанию, в начало списка попадают заглавные буквы в алфавитном порядке, и только потом идут строчные буквы тоже в алфавитном порядке.
console.log(['A', 'Z', 'a', 'z'].sort()); // ['A', 'Z', 'a', 'z']
Объект Intl.Collator
корректно решает не только эту проблему, но и нектороые другие. Например, в Германии буква ä
следует сразу за a
, а в Швеции эта буква находится в самом конце алфавита после z
.
Мы можем выбрать нужную локаль и получить строки отсортированные в соответствии с правилами нужного языкового стандарта.
Так, в результате исполнения сортировки массивов строк с учетом особенностей различных стран (Германии и Швеции):
console.log(['b', 'a', 'z', 'ä'].sort(new Intl.Collator('de').compare));
console.log(['b', 'a', 'z', 'ä'].sort(new Intl.Collator('sv').compare));
мы получим результат:
['a', 'ä', 'b', 'z']
['a', 'b', 'z', 'ä']
Таким образом, в результат выполнения задачи мы увидим в консоли два отсортированных массива. Причем первый массив будет учитывать правила английского языка, так как для объекта Intl.Collator
установлена локаль en
. Второй массив будет учитывать регистр символов при сортировке строк: в начало списка попадут строки, начинающиеся с заглавных букв, а в конец списка попадут строки, состоящие из строчных символов.
let words = ["apple", "zebrs", "America", "Boston", "bloom"];
console.log(words.sort(new Intl.Collator("en").compare));
console.log(words.sort());
// ['America', 'apple', 'bloom', 'Boston', 'zebra']
// ['America', 'Boston', 'apple', 'bloom', 'zebra']
Спасибо за внимание.