Int.Collator и сравнение строк

Последнее обновление: 16.11.2023

Для сравнения строк с учетом языка применяется тип 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"]
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850