Быстрая сортировка строк с Intl.Collator

Улучшите сортировку строк с учётом локали, заменив повторяющиеся вызовы String.localeCompare одним экземпляром Intl.Collator для более быстрого и эффективного сравнения.

Сортировка строк может создавать неожиданные проблемы с производительностью, особенно при работе с большими наборами данных, нуждающимися в соответствующей локализации. Многие разработчики полагаются на String.localeCompare для сортировки по алфавиту, но есть и более эффективный подход, заслуживающий внимания.

Ограничение String.localeCompare

Большинство JavaScript разработчиков знакомы с подобным кодом:

const names = ["Élodie", "Anna", "Özil", "Bob"];

// Стандартный подход с localeCompare
const sortedNames = names.sort((a, b) =>
a.localeCompare(b, "en", { sensitivity: "base" }),
);

console.log(sortedNames);
// Output: ["Anna", "Bob", "Élodie", "Özil"]

Это отлично работает с небольшими массивами, но становится проблемным при работе с большими массивами данных. В чём проблема? Каждый вызов localeCompare заново обрабатывает настройки локали, что создаёт значительную нагрузку, если повторяется тысячи раз во время операции сортировки.

API Intl.Collator предоставляет лучшую альтернативу, позволяя разработчикам создавать многократно используемый объект Collator:

const names = ["Élodie", "Anna", "Özil", "Bob"];

// Создаётся один раз, используется многократно
const collator = new Intl.Collator("en", { sensitivity: "base" });
const sortedNames = names.sort((a, b) => collator.compare(a, b));

console.log(sortedNames);
// Output: ["Anna", "Bob", "Élodie", "Özil"]

Этот подход инициализирует настройки локали только один раз, а затем использует их для всех сравнений.

Влияние на производительность

Тестирование на больших наборах данных показывает, что время сортировки улучшается на 60-80% при использовании Intl.Collator вместо повторяющихся вызовов localeCompare. Для приложений, отображающих тысячи отсортированных записей, это может превратить заметно тормозящий интерфейс в отзывчивый.

Код также становится более удобным в сопровождении. Вместо повторяющихся параметров локали по всей кодовой базе можно создать один объект Collator в виде утилиты и повторно использовать его везде, где требуется сортировка.

Лучшие варианты применения

Intl.Collator обеспечивает максимальное преимущество в следующих сценариях:

Для очень маленьких списков или разовых операций сортировки разница в производительности будет незначительной по сравнению с дополнительным кодом настройки.

Совместимость с браузерами

Intl.Collator хорошо поддерживается современными браузерами (даже IE 11) и средами Node.js. Однако для приложений, поддерживающих устаревшие браузеры, может потребоваться проверка совместимости или полифилл.

Заключение

Для разработчиков, работающих с серьёзными задачами сортировки строк, особенно с текстом на разных языках, Intl.Collator представляет простую оптимизацию с существенными преимуществами в реальном мире. Это небольшое изменение в реализации, способное заметно повысить производительность приложения.

Комментарии


Дополнительные материалы

Предыдущая Статья

Использование currentColor

Следующая Статья

Отсутствующий в Eloquent метод owns()