LocaleCompare: примеры (JAVASCRIPT)
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
Сортировка массива объектов по строковому свойству
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
const collator = new Intl.Collator('ru', { sensitivity: 'accent', caseFirst: 'upper' });
let words = ['Арбуз', 'арфа', 'Аист', 'банан'];
words.sort(collator.compare);
console.log(words);['Аист', 'Арбуз', 'арфа', 'банан'] // Сначала заглавные 'А'
Сравнение с игнорированием знаков препинания
let str1 = 'Что-то';
let str2 = 'чтото';
console.log(str1.localeCompare(str2, 'ru', {ignorePunctuation: true}));0 // Дефис проигнорирован, строки равны
Сортировка смешанных числово-текстовых данных
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']
Использование для поиска без учета диакритических знаков
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'
Сортировка с учетом порядка символов эмодзи
let emojis = ['❤️', '????', '????', '????'];
emojis.sort((a,b) => a.localeCompare(b));
console.log(emojis);['????', '????', '❤️', '????'] // Порядок может зависеть от платформы и локали