LocaleCompare: примеры (JAVASCRIPT)

Сравнение строк с учетом локали: метод localeCompare
Раздел: Строки, Сравнение
localeCompare(compareString: String, [locales, options]): Number

Основные сведения о методе localeCompare

Метод localeCompare() предназначен для сравнения двух строк с учетом правил конкретного языка (локали). Он не просто проверяет порядок кодов символов в Unicode, а применяет лингвистически корректные правила сортировки. Этот метод используется, когда необходимо корректно отсортировать или сравнить строки, отображаемые пользователю, например, имена или названия городов.

Синтаксис метода: referenceStr.localeCompare(compareString[, locales[, options]]).

Аргументы метода

  • compareString (обязательный): строка, с которой происходит сравнение.
  • locales (необязательный): строка с тегом языка BCP 47 или массив таких строк. Определяет язык, правила которого нужно использовать (например, 'ru', 'de-DE', 'en-US').
  • options (необязательный): объект с настройками сравнения. Он может содержать следующие свойства:
    • sensitivity: определяет, как сравниваются символы. Возможные значения: 'base' (только базовые буквы, 'a' и 'ä' равны), 'accent' (учитывает акценты, 'a' ≠ 'á'), 'case' (учитывает регистр, 'a' ≠ 'A'), 'variant' (учитывает и акценты, и регистр, значение по умолчанию).
    • ignorePunctuation: логическое значение. Если true, игнорирует знаки препинания.
    • numeric: если true, сравнивает строки как числа (например, '10' > '2').
    • caseFirst: определяет, какие буквы идут первыми при сортировке: 'upper' (верхний регистр), 'lower' (нижний регистр) или 'false' (по умолчанию, зависит от локали).
    • usage: обычно не указывается. Может быть 'sort' (по умолчанию) или 'search'.

Возвращаемое значение

Метод возвращает число:

  • Отрицательное число (обычно -1), если referenceStr идет перед compareString в порядке сортировки.
  • 0, если строки считаются равными.
  • Положительное число (обычно 1), если referenceStr идет после compareString.

Базовые примеры использования localeCompare

Простое сравнение строк

console.log('апрель'.localeCompare('май'));
console.log('январь'.localeCompare('январь'));
-1
0

Сравнение с указанием локали

console.log('ä'.localeCompare('z', 'de')); // Немецкая локаль
console.log('ä'.localeCompare('z', 'sv')); // Шведская локаль
-1
1

Использование флага numeric

let items = ['строка10', 'строка2'];
items.sort((a,b) => a.localeCompare(b, 'ru', {numeric: true}));
console.log(items);
['строка2', 'строка10']

Использование флага sensitivity

console.log('a'.localeCompare('A', 'ru', {sensitivity: 'base'}));
console.log('a'.localeCompare('A', 'ru', {sensitivity: 'case'}));
0
-1

Похожие функции и методы в JavaScript

  • Операторы сравнения (>, <, ==): сравнивают строки по порядку кодовых точек Unicode, не учитывая правила локали. Для простого, бинарного сравнения в техническом контексте.
  • String.prototype.toLowerCase() / toUpperCase() с операторами: позволяют проводить сравнение без учета регистра, но не учитывают акценты и специфику языков. Быстрее, но менее точно для пользовательских данных.
  • Intl.Collator: более производительная и гибкая альтернатива для многократной сортировки. Создается один раз, а затем используется для множества сравнений. Предпочтителен внутри циклов сортировки больших массивов.

Функции сравнения строк в других языках программирования

PHP: strcoll() и Collator

setlocale(LC_COLLATE, 'ru_RU.UTF-8');
echo strcoll('апрель', 'май'); // Возвращает <0
-1

Python: locale.strxfrm() и sorted() с key

import locale
locale.setlocale(locale.LC_COLLATE, 'ru_RU.UTF-8')
sorted_list = sorted(['май', 'апрель'], key=locale.strxfrm)
print(sorted_list)
['апрель', 'май']

MySQL: COLLATE в запросах

SELECT * FROM table ORDER BY name COLLATE utf8mb4_unicode_ci;
// Результат зависит от данных в таблице

C: strcoll() из библиотеки

#include 
#include 
setlocale(LC_COLLATE, "ru_RU.UTF-8");
int result = strcoll("апрель", "май"); // result < 0
-1

Основное отличие в том, что в JavaScript параметры сравнения задаются динамически в методе или через Intl.Collator, в то время как в C, PHP, Python часто требуется предварительная настройка глобальной локали процесса или потока.

Распространенные ошибки и проблемы

Ожидание точных значений -1, 0, 1

Метод может возвращать любое отрицательное или положительное число.

let res = 'a'.localeCompare('b');
console.log(res === -1); // Ненадежная проверка
false // Может быть другое отрицательное число

Правильно проверять только знак числа.

let res = 'a'.localeCompare('b');
console.log(res < 0); // Правильно
true

Неявное преобразование undefined или null в строку

console.log('текст'.localeCompare(undefined));
TypeError: Cannot read properties of undefined (reading 'localeCompare')

Аргумент должен быть строкой. Нужна явная проверка.

Игнорирование необходимости сортировки массива

Метод сам по себе не сортирует массив, он лишь сравнивает две строки.

let arr = ['яблоко', 'Абрикос'];
let result = arr.localeCompare(arr[0]); // Неправильно
// Для сортировки нужен arr.sort() с функцией-компаратором

История изменений и современная поддержка

Метод localeCompare существует с ранних версий JavaScript, но его расширенная форма с аргументами locales и options стандартизирована в спецификации ECMAScript Internationalization API (ECMA-402).

  • Поддержка объекта options была существенно расширена. Добавлены свойства caseFirst, ignorePunctuation, numeric.
  • Стало возможным указывать несколько локалей в массиве для выбора первой доступной.
  • Современные движки JavaScript оптимизируют производительность метода, особенно при повторных вызовах с одинаковыми аргументами.
  • Для максимальной кросс-браузерной совместимости сложных сценариев рекомендуется использование объекта Intl.Collator.

Расширенные примеры применения localeCompare

Сортировка массива объектов по строковому свойству

Пример javascript
let users = [
  { name: 'иван', age: 30 },
  { name: 'Анна', age: 25 },
  { name: 'ёлка', age: 35 }
];
users.sort((a, b) => a.name.localeCompare(b.name, 'ru'));
console.log(users.map(u => u.name));
['Анна', 'иван', 'ёлка'] // В русском алфавите 'ё' идет после 'е'

Создание пользовательского компаратора с помощью Intl.Collator

Пример javascript
const collator = new Intl.Collator('ru', { sensitivity: 'accent', caseFirst: 'upper' });
let words = ['Арбуз', 'арфа', 'Аист', 'банан'];
words.sort(collator.compare);
console.log(words);
['Аист', 'Арбуз', 'арфа', 'банан'] // Сначала заглавные 'А'

Сравнение с игнорированием знаков препинания

Пример javascript
let str1 = 'Что-то';
let str2 = 'чтото';
console.log(str1.localeCompare(str2, 'ru', {ignorePunctuation: true}));
0 // Дефис проигнорирован, строки равны

Сортировка смешанных числово-текстовых данных

Пример javascript
let files = ['img100.jpg', 'img20.jpg', 'img1.jpg'];
files.sort((a,b) => a.localeCompare(b, 'en', {numeric: true}));
console.log(files);
['img1.jpg', 'img20.jpg', 'img100.jpg']

Использование для поиска без учета диакритических знаков

Пример javascript
let baseWord = 'cafe';
let list = ['café', 'caffeine', 'coffee'];
let matches = list.filter(word => 
  baseWord.localeCompare(word, 'en', {sensitivity: 'base'}) === 0
);
console.log(matches);
['café'] // 'cafe' и 'café' считаются равными при sensitivity: 'base'

Сортировка с учетом порядка символов эмодзи

Пример javascript
let emojis = ['❤️', '????', '????', '????'];
emojis.sort((a,b) => a.localeCompare(b));
console.log(emojis);
['????', '????', '❤️', '????'] // Порядок может зависеть от платформы и локали

JS localeCompare function comments

En
LocaleCompare Returns a number indicating whether a reference string comes before or after or is the same as the given string