Для сравнения строк с учетом языка применяется тип Collator. Для этого тип Collator
предоставляет метод
compare(), который в качестве параметров принимает две строки:
collator.compare(string1, string2)
Метод compare
возвращает одно из трех числовых значений:
1, если первая строка "больше", чем вторая (первая строка расположена после второй строки в лексикографическом порядке).
-1, если вторая строка "больше" первой (первая строка располагается до второй строки)
0, если обе строки равны
Пример сравнения:
const collator = new Intl.Collator("ru-RU"); console.log(collator.compare("б", "А")); // 1 console.log(collator.compare("б", "Б")); // -1 console.log(collator.compare("б", "В")); // -1 console.log(collator.compare("б", "б")); // 0 console.log(collator.compare("мир", "миг")); // 1 console.log(collator.compare("мир", "миф")); // -1 console.log(collator.compare("мир", "мир")); // 0
Принцип сравнения строк определяется объектом конфигурации, который передается в конструктор Int.Colator
в качестве второго параметра и который
определяет следующие свойства:
localeMatcher: представляет используемый алгоритм выбора локали. Может принимать два значения: "lookup" и "best fit" (значение по умолчанию). Значение
lookup
предполагает использование алгоритма,
определенного в стандарте. Значение best fit
использует локаль, которую предоставляет среда выполнения
usage: указывает, будет ли сравнение строк использоваться для сортировки или для поиска строк. Возможные значения — сортировка и поиск соответственно. Возможные значения: "sort" (для поиска) и "search" (для сортировки - значение по умолчанию)
sensitivity: указывает, какие символы следует считать неравными. Возможные значения:
"base"
: строки считаются неравными, если они различаются по базовым буквам. Например: a ≠ b, a = á, a = A.
"accent"
: строки считаются неравными, если они различаются по базовым буквам или диакритическим знакам. Например: a ≠ b, a ≠ á, a = A.
"case"
: строки считаются неравными, если они различаются по базовым буквам или регистру. Например: a ≠ b, a = á, a ≠ A.
"variant"
: строки считаются неравными, если они различаются по базовым буквам, регистру или диакритическим знакам. Например: a ≠ b, a ≠ á, a ≠ A. Значение по умолчанию
ignorePunctuation: надо ли игнорировать пунктуацию. Принимает значения true (пунктуация игнорируется) и false (не игнорируется, значение по умолчанию)
numeric: указывает, надо ли сравнивать строки как числа (например, "1" < "5" < "10"). Принимает значения
true
и false
(значение по умолчанию)
caseFirst: указывает, надо ли учитывать регистр первой буквы. Принимает значения
true
и false
(значение по умолчанию)
Например, не будем учитывать регистр при сравнении:
const standardCollator = new Intl.Collator("ru-RU"); console.log(standardCollator.compare("Дом", "дом")); // 1 - строки не равны const baseCollator = new Intl.Collator("ru-RU", {sensitivity: "base"}); console.log(baseCollator.compare("Дом", "дом")); // 0 - строки равны
Метод compare()
удобно использовать для сортировки массива строк. В частности, метод sort() у объекта массива
принимает функцию сортировки или сравнения, которая затем сравнивает элементы соответствующего массива попарно и, таким образом, выполняет сортировку:
const collator = new Intl.Collator("en", {usage: "sort"}); const people = ["Tom", "Bob", "Sam", "Alice", "Kate"]; people.sort(collator.compare); // сортируем массив console.log(people); // ["Alice", "Bob", "Kate", "Sam", "Tom"]