data в Awesomplete определяет способ извлечения значения из элемента источника данных, используемого для фильтрации, сортировки и сопоставления ввода пользователя с элементами списка автодополнения. Этот параметр становится ключевым при работе со сложными структурами данных, когда список состоит не из строк, а из объектов или массивов, и требуется явно указать, какое поле участвует в поиске и сравнении.
В стандартном режиме Awesomplete предполагает, что каждый элемент списка — это строка. В этом случае механизм сопоставления прост: ввод пользователя сравнивается непосредственно со значением элемента. Однако при переходе к объектным данным поведение становится неоднозначным, и именно параметр data задаёт правило извлечения сравниваемого значения.
Внутри Awesomplete процесс формирования подсказок проходит несколько стадий:
Параметр data участвует во второй стадии и определяет, какое значение будет считаться «ключевым» для элемента.
Если data не задан, библиотека использует значение элемента напрямую. Если задан — применяется функция или правило извлечения.
Параметр data может принимать несколько форм, каждая из которых используется в зависимости от структуры данных.
Наиболее гибкий вариант — передача функции:
data: function(item, input) {
return item.value;
}
Здесь:
Функция должна вернуть строку или значение, по которому будет выполняться сравнение.
При работе с объектами data позволяет указать, какое поле участвует в поиске:
new Awesomplete(input, {
list: [
{ label: "JavaScript", value: "js" },
{ label: "TypeScript", value: "ts" }
],
data: function(item) {
return item.label;
}
});
В этом случае пользователь видит один набор данных, но поиск происходит по полю label.
Во многих случаях допускается упрощённая форма — строка с именем свойства:
data: "label"
Такой вариант эквивалентен функции:
data: function(item) {
return item["label"];
}
Этот формат используется, когда структура данных стабильна и не требует дополнительной логики.
Awesomplete использует значение, возвращаемое data, не только для сравнения, но и для определения релевантности элемента. Это означает, что:
Если data возвращает неожиданный результат (например, числовое поле или null), поведение автодополнения может стать непредсказуемым.
Часто данные приходят в виде вложенных объектов:
{
name: "React",
meta: {
category: "library"
}
}
В этом случае data может извлекать вложенные значения:
data: function(item) {
return item.meta.category;
}
Такой подход позволяет строить автодополнение не только по имени, но и по внутренним атрибутам объектов.
Параметр data тесно взаимодействует с другими настройками:
Таким образом, data формирует логический слой данных, отделённый от представления.
new Awesomplete(input, {
list: [
{ name: "JavaScript", id: 1 },
{ name: "TypeScript", id: 2 }
],
data: function(item) {
return item.name;
},
item: function(text, item) {
return Awesomplete.ITEM(text, item.name);
}
});
Здесь:
data: function(item) {
return item.code;
}
При этом пользователь видит:
item.name
Такой разрыв между поисковым и отображаемым значением часто используется в справочниках и кодовых системах.
Неправильная конфигурация data часто приводит к некорректной работе автодополнения.
data: function(item) {
return item;
}
В этом случае сравнение может превратиться в
[object Object], что делает поиск бесполезным.
Если часть элементов массива — строки, а часть — объекты, data может вести себя нестабильно:
list: ["JavaScript", { name: "TypeScript" }]
При такой смеси требуется нормализация данных.
data: function(item) {
return item.name.toLowerCase();
}
Если item не содержит name, возникнет ошибка выполнения. Более устойчивый вариант:
data: function(item) {
return (item.name || "").toLowerCase();
}
При больших объёмах данных (тысячи элементов) функция data вызывается многократно в процессе фильтрации. Поэтому:
Оптимальная стратегия — подготовить структуру данных заранее и использовать data только для быстрого доступа к полю.
При динамической загрузке данных (например, из API) data помогает унифицировать формат:
fetch("/api/languages")
.then(r => r.json())
.then(dataList => {
new Awesomplete(input, {
list: dataList,
data: item => item.title
});
});
Таким образом, независимо от структуры ответа API, Awesomplete работает с предсказуемым ключом.
Параметр data можно рассматривать как слой абстракции между:
Он позволяет разделить:
Это делает компонент гибким и пригодным для использования в сложных интерфейсах, где данные редко бывают простыми строками.