Поведение сортировки в Tom Select определяет порядок отображения найденных элементов в выпадающем списке и напрямую влияет на восприятие качества поиска. В отличие от простого рендеринга массива, библиотека комбинирует несколько уровней ранжирования: результат поиска, приоритет совпадений и пользовательскую логику сортировки.
Сортировка применяется уже после того, как механизм поиска сформировал набор подходящих опций. Это означает, что сначала происходит фильтрация и оценка релевантности, затем — упорядочивание.
По умолчанию Tom Select использует встроенную сортировку, ориентированную на релевантность:
Внутренне это связано с механизмом ранжирования поиска, где каждая опция получает числовую оценку. Чем ниже значение score, тем выше приоритет.
Основной способ управления сортировкой — параметр
sortField. Он определяет, по каким полям объекта данных и в
каком порядке будет выполняться сортировка после поиска.
new TomSelect("#select", {
sortField: "text"
});
В этом случае сортировка происходит по строковому полю
text.
Можно задавать несколько правил сортировки, формируя цепочку приоритетов:
new TomSelect("#select", {
sortField: [
{ field: "priority", direction: "desc" },
{ field: "text", direction: "asc" }
]
});
Здесь:
priority сортируется по убыванию;text.Такой подход позволяет реализовывать сложные сценарии, например:
Параметр direction принимает значения:
"asc" — по возрастанию;"desc" — по убыванию.При числовых полях это влияет на порядок приоритетов, при строковых — на алфавитный порядок.
Важный аспект поведения Tom Select — сортировка не заменяет поиск, а работает поверх него.
Алгоритм можно представить так:
sortField или пользовательская
сортировка.Если пользовательская сортировка конфликтует с релевантностью поиска, приоритет обычно остаётся за механизмом scoring.
В некоторых сценариях требуется полностью контролировать порядок элементов. Для этого можно отключить встроенную сортировку, возвращая неизменённый порядок данных.
new TomSelect("#select", {
sortField: null
});
или через пустой массив:
new TomSelect("#select", {
sortField: []
});
Это полезно, когда:
Для максимального контроля используется sortFn (или
аналогичная пользовательская функция сортировки, в зависимости от версии
и конфигурации).
new TomSelect("#select", {
sortField: {
field: "text",
sort: function(a, b) {
return a.text.length - b.text.length;
}
}
});
В этом примере элементы сортируются по длине строки:
При кастомной сортировке важно учитывать результат поиска. Каждый элемент может содержать метаданные, включая score:
sort: function(a, b) {
if (a.score !== b.score) {
return a.score - b.score;
}
return a.text.localeCompare(b.text);
}
Такой подход сохраняет релевантность поиска и добавляет вторичный критерий.
Tom Select использует внутреннюю систему оценки совпадений. Каждая опция получает score, зависящий от:
Чем лучше совпадение, тем выше позиция элемента до применения дополнительной сортировки.
Важно учитывать, что принудительная сортировка может «сломать» релевантность, если полностью игнорировать score.
При использовании групп (optgroup) сортировка имеет два
уровня:
new TomSelect("#select", {
optgroupField: "category",
sortField: [
{ field: "category", direction: "asc" },
{ field: "text", direction: "asc" }
]
});
Здесь сначала упорядочиваются группы, затем элементы внутри них.
При использовании AJAX или динамической подгрузки данных сервер может возвращать уже отсортированный список. В этом случае локальная сортировка может быть избыточной.
Типичный сценарий:
new TomSelect("#select", {
load: function(query, callback) {
fetch(`/search?q=${query}`)
.then(res => res.json())
.then(data => callback(data.items));
},
sortField: null
});
Сервер полностью контролирует порядок, клиент только отображает результат.
При одинаковых значениях ключей сортировки поведение может зависеть от реализации JavaScript-движка. Для обеспечения стабильности добавляется вторичный критерий:
sort: function(a, b) {
if (a.text === b.text) {
return a.id - b.id;
}
return a.text.localeCompare(b.text);
}
При большом количестве элементов сортировка становится значимым фактором производительности.
Основные рекомендации по оптимизации:
sort;priority);Особенно критично это при использовании fuzzy search, где уже на этапе поиска выполняются вычислительные операции.
Сортировка влияет только на порядок элементов, но не на их визуальное представление. При кастомном рендеринге важно не смешивать визуальные метки с логикой сортировки.
new TomSelect("#select", {
sortField: [
{ field: "priority", direction: "desc" }
],
render: {
option: function(data) {
return `<div>${data.text}</div>`;
}
}
});
Сортировка остаётся независимой от HTML-структуры.
На практике часто встречаются следующие проблемы:
Корректная архитектура предполагает чёткое разделение: