В библиотеке Tom Select структура данных играет ключевую роль,
поскольку именно она определяет, как элементы отображаются, фильтруются,
выбираются и сериализуются. В отличие от простых HTML-элементов
<select>, где данные ограничены атрибутами
<option>, Tom Select работает с унифицированной
моделью объектов, позволяющей гибко управлять источниками данных,
отображением и взаимодействием.
Каждый элемент данных в Tom Select представлен объектом со строго определённой структурой. Минимальный набор свойств выглядит следующим образом:
value — уникальный идентификатор элементаtext — отображаемый текстdisabled — флаг недоступности (опционально)optgroup — принадлежность к группе (опционально)$order — внутренний порядок сортировки (используется
при необходимости сохранения стабильного порядка)Пример базового объекта:
{
value: "1",
text: "Москва"
}
Эта структура является основной единицей, с которой работает Tom Select при добавлении, удалении и отображении элементов.
В некоторых случаях Tom Select допускает упрощённый формат данных —
массив строк. В этом случае строки автоматически преобразуются в объекты
с одинаковыми value и text.
Пример:
["HTML", "CSS", "JavaScript"]
После нормализации:
[
{ value: "HTML", text: "HTML" },
{ value: "CSS", text: "CSS" },
{ value: "JavaScript", text: "JavaScript" }
]
Такой подход используется для быстрых инициализаций, когда отсутствует необходимость в дополнительной метаинформации.
При инициализации Tom Select данные могут передаваться через параметр
options. Это основной способ задания набора элементов.
new TomSelect("#select", {
options: [
{ value: "ru", text: "Русский" },
{ value: "en", text: "English" }
]
});
Каждый объект в массиве интерпретируется как отдельный вариант выбора.
Важно учитывать, что поле value должно быть уникальным в
пределах списка. При совпадении значений поведение становится
неопределённым и зависит от внутренней логики обработки коллекции.
<option>При инициализации на основе существующего <select>
элементы автоматически преобразуются в внутренний формат Tom Select.
HTML:
<select id="select">
<option value="1">Первый</option>
<option value="2">Второй</option>
</select>
Внутреннее представление:
[
{ value: "1", text: "Первый" },
{ value: "2", text: "Второй" }
]
Если присутствует атрибут disabled, он также переносится
в объект:
<option value="3" disabled>Третий</option>
{
value: "3",
text: "Третий",
disabled: true
}
Tom Select поддерживает группировку элементов через поле
optgroup. Это позволяет структурировать список
иерархически.
{
value: "paris",
text: "Париж",
optgroup: "france"
}
Группы могут быть определены отдельно:
optgroups: [
{ value: "france", label: "Франция" },
{ value: "germany", label: "Германия" }
]
Каждый элемент связывается с группой через совпадение
optgroup.
Несмотря на наличие стандартного набора полей, Tom Select не ограничивает структуру данных. Объекты могут содержать дополнительные свойства:
{
value: "ru",
text: "Русский",
code: "RU",
region: "Eastern Europe",
population: 144000000
}
Такие поля не участвуют в базовой логике выбора, но могут использоваться в:
render)score)Расширение модели данных особенно полезно при работе с API, где объекты приходят с большим количеством атрибутов.
При загрузке данных через load функция ожидает массив
объектов в том же формате, что и options.
new TomSelect("#select", {
load: function(query, callback) {
fetch(`/api/cities?q=${query}`)
.then(res => res.json())
.then(data => {
callback(data);
});
}
});
Ответ API должен соответствовать структуре:
[
{ value: "msk", text: "Москва" },
{ value: "spb", text: "Санкт-Петербург" }
]
Несоответствие формата приводит к некорректному отображению или отсутствию элементов.
Перед использованием данные проходят процесс нормализации. Он включает:
{value, text}valueПример нормализации:
Вход:
[{ value: 1, text: "Один" }]
После обработки:
[{ value: "1", text: "Один" }]
Это поведение важно учитывать при сравнении значений, особенно если исходные данные используют числовые идентификаторы.
При извлечении выбранных значений используется формат, зависящий от конфигурации.
Метод getValue() возвращает:
Пример:
select.getValue(); // "ru"
или
select.getValue(); // ["ru", "en"]
При этом возвращаются именно value, а не полный
объект.
Для получения полных объектов используется метод getItem
или доступ к внутренней коллекции элементов.
Внутреннее представление сохраняет исходные данные:
select.options["ru"]
Результат:
{
value: "ru",
text: "Русский",
code: "RU"
}
Таким образом, value выступает ключом для быстрого
доступа к данным.
Tom Select ожидает строгого соответствия минимальной структуре. Основные требования:
valuetext (или его аналога через label
в некоторых конфигурациях)undefined и null в критических
поляхНарушение этих условий приводит к:
При динамическом обновлении списка через addOption,
removeOption или clearOptions используется тот
же формат объектов.
select.addOption({
value: "de",
text: "Deutsch"
});
Обновление данных не требует повторной инициализации компонента, поскольку внутренняя модель синхронизируется с новым объектом.
Для обеспечения стабильного поведения Tom Select использует
value как основной идентификатор. Это означает:
text не влияет на идентичность элементаvalue фактически создаёт новый элемент$order{
value: "1",
text: "Москва",
$order: 10
}
Поле $order используется внутренней системой сортировки
и не должно изменяться без необходимости, так как влияет на стабильность
отображения.
Tom Select допускает несколько входных форматов:
{value, text}<select> элементыОднако после инициализации все форматы приводятся к единой внутренней структуре. Это обеспечивает единообразное поведение API независимо от источника данных.
Единая концепция данных Tom Select сводится к объекту-элементу с
обязательным ключом value и отображаемым полем
text. Остальные свойства расширяют функциональность, но не
влияют на базовую механику выбора. Вся система построена вокруг
нормализованного набора объектов, обеспечивающего предсказуемость работы
при любых способах загрузки и изменения данных.