Быстрая сортировка строк с 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
представляет простую оптимизацию с существенными преимуществами в реальном мире. Это небольшое изменение в реализации, способное заметно повысить производительность приложения.