Библиотека Choices.js оперирует строго структурированными данными,
которые описывают элементы списка выбора. В отличие от нативного
<select>, где структура задаётся через HTML-опции,
здесь всё строится вокруг JavaScript-объектов и массивов, которые
проходят нормализацию внутри библиотеки.
Ключевая идея формата данных заключается в том, что каждый элемент выбора представлен объектом с фиксированными полями, а дополнительные данные могут расширяться через пользовательские свойства.
Каждый элемент в Choices.js представляет собой объект со следующей базовой структурой:
{
value: 'uk',
label: 'United Kingdom'
}
value Уникальное значение, которое будет отправлено в форме или использовано в логике приложения.
label Отображаемый текст элемента в списке.
Эти два поля являются фундаментом и используются в большинстве сценариев без дополнительной конфигурации.
Помимо базовых свойств, Choices.js поддерживает расширенный набор параметров:
{
value: 'us',
label: 'United States',
selected: false,
disabled: false,
placeholder: false,
customProperties: {
continent: 'North America',
code: 'USA'
}
}
selected Определяет, выбран ли элемент при инициализации.
disabled Блокирует возможность выбора элемента.
placeholder Помечает элемент как плейсхолдер, который не участвует в выборе.
customProperties Произвольный объект для хранения метаданных, не влияющих напрямую на поведение компонента, но доступных в логике приложения.
Формат данных передаётся в конфигурации при создании экземпляра:
const choices = new Choices('#select', {
choices: [
{ value: 'ru', label: 'Russia' },
{ value: 'kz', label: 'Kazakhstan' },
{ value: 'us', label: 'United States' }
]
});
В этом случае массив choices полностью заменяет
необходимость использования <option> внутри
HTML-элемента.
Choices.js поддерживает гибридную модель, при которой часть данных берётся из DOM, а часть добавляется программно:
const choices = new Choices('#select');
choices.setChoices([
{ value: 'de', label: 'Germany' },
{ value: 'fr', label: 'France' }
], 'value', 'label', false);
Choices.js поддерживает группировку элементов через поле
group:
[
{
label: 'Europe',
id: 'eu',
choices: [
{ value: 'de', label: 'Germany' },
{ value: 'fr', label: 'France' }
]
},
{
label: 'Asia',
id: 'asia',
choices: [
{ value: 'kz', label: 'Kazakhstan' },
{ value: 'jp', label: 'Japan' }
]
}
]
choicesChoices.js автоматически приводит входные данные к внутреннему стандарту. Даже если данные поступают в упрощённом виде, библиотека расширяет их до полного объекта.
Пример входных данных:
[
'Kazakhstan',
'Russia',
'USA'
]
После нормализации:
[
{ value: 'Kazakhstan', label: 'Kazakhstan' },
{ value: 'Russia', label: 'Russia' },
{ value: 'USA', label: 'USA' }
]
Если объект уже содержит value и label, он
остаётся без изменений.
Поле customProperties позволяет внедрять дополнительные
данные, которые не отображаются напрямую, но используются в логике
приложения:
{
value: 'kz',
label: 'Kazakhstan',
customProperties: {
region: 'Central Asia',
population: 19000000
}
}
Формат данных также включает управляющие свойства, влияющие на поведение списка.
{
value: 'ru',
label: 'Russia',
selected: true
}
Используется для предустановленного выбора.
{
value: 'us',
label: 'United States',
disabled: true
}
Элемент отображается, но недоступен для выбора.
{
value: '',
label: 'Select country',
placeholder: true
}
Используется как визуальная подсказка без участия в выборе.
При работе с API данные обычно приходят в JSON-формате, который требует приведения к структуре Choices.js.
Пример ответа API:
[
{ "id": 1, "name": "Germany" },
{ "id": 2, "name": "France" }
]
Преобразование:
fetch('/api/countries')
.then(res => res.json())
.then(data => {
const formatted = data.map(item => ({
value: item.id,
label: item.name
}));
choices.setChoices(formatted, 'value', 'label', true);
});
Используется при небольшом количестве данных:
choices.setChoices([
{ value: '1', label: 'One' },
{ value: '2', label: 'Two' }
]);
Используется для динамических списков:
Исходный HTML:
<select>
<option value="ru">Russia</option>
<option value="kz">Kazakhstan</option>
</select>
Choices.js преобразует их в объектную структуру автоматически.
Хотя базовый формат плоский, библиотека допускает сложные структуры через группировку и вложенные массивы:
[
{
label: 'Frontend',
choices: [
{ value: 'js', label: 'JavaScript' },
{ value: 'ts', label: 'TypeScript' }
]
}
]
Такая модель используется для построения категориальных списков и многоуровневых интерфейсов выбора.
Несмотря на гибкость, Choices.js ожидает строгую консистентность:
value должен быть уникальнымlabel должен быть строкойchoicesНесоблюдение структуры приводит к некорректному отображению или потере элементов.
Типичный паттерн работы с форматом данных заключается в промежуточном слое адаптации:
function adaptUsers(users) {
return users.map(user => ({
value: user.id,
label: `${user.firstName} ${user.lastName}`,
customProperties: {
email: user.email
}
}));
}
Такой подход позволяет отделить API-структуру от внутреннего формата библиотеки.
При работе с формами Choices.js возвращает только value
выбранных элементов. Остальные поля (label,
customProperties) не сериализуются автоматически и
используются только на клиентской стороне.
Это делает формат данных одновременно: