filter в Awesomplete определяет логику отбора элементов из исходного списка перед отображением выпадающих подсказок. Это ключевой механизм, отвечающий за то, какие значения считаются релевантными текущему вводу пользователя.
Основная задача параметра filter — контроль соответствия элементов списка введённому тексту. По умолчанию библиотека использует простую стратегию поиска подстроки, но поведение может быть полностью переопределено.
Ключевые функции параметра:
Параметр задаётся как функция:
filter: function(text, input) {
return Boolean;
}
Где:
В базовой конфигурации Awesomplete используется фильтр, основанный на поиске подстроки:
function defaultFilter(text, input) {
return RegExp(input.trim(), "i").test(text);
}
Особенности стандартного фильтра:
Процесс фильтрации проходит в несколько этапов:
Фильтрация выполняется синхронно при каждом изменении input-события, что делает её критичной с точки зрения производительности.
Переопределение filter позволяет реализовать любую логику сравнения.
new Awesomplete(input, {
list: ["Apple", "Apricot", "Banana", "Blueberry"],
filter: function(text, input) {
return text.toLowerCase().startsWith(input.toLowerCase());
}
});
В этом случае совпадение происходит только если строка начинается с введённого текста.
filter: function(text, input) {
const words = input.toLowerCase().split(/\s+/);
const target = text.toLowerCase();
return words.every(word => target.includes(word));
}
Здесь реализована логика, при которой все слова ввода должны присутствовать в элементе списка, независимо от порядка.
filter: function(text, input) {
const inputTokens = input.toLowerCase().split(/\s+/);
const textTokens = text.toLowerCase().split(/\s+/);
return inputTokens.every(t => textTokens.includes(t));
}
Такой подход используется при необходимости строгого совпадения по набору слов.
Регистронезависимость реализуется вручную внутри filter, поскольку Awesomplete не навязывает единую стратегию сравнения.
filter: function(text, input) {
return text.toLowerCase().includes(input.toLowerCase());
}
Типовые стратегии:
Для языков с диакритическими знаками часто требуется нормализация:
function normalize(str) {
return str
.toLowerCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "");
}
filter: function(text, input) {
return normalize(text).includes(normalize(input));
}
Эффект:
Поскольку filter вызывается при каждом вводе символа, важно учитывать стоимость операций:
Рекомендации по оптимизации логики:
Awesomplete поддерживает не только строки, но и объекты:
list: [
{ label: "Apple", value: "apple" },
{ label: "Banana", value: "banana" }
]
В этом случае filter должен учитывать структуру данных:
filter: function(item, input) {
return item.label.toLowerCase().includes(input.toLowerCase());
}
Фильтр определяет, будут ли отображаться:
Пример частичного поиска:
filter: function(text, input) {
return text.indexOf(input) !== -1;
}
filter часто используется совместно с:
Типовой сценарий:
filter: function(text, input) {
let ti = 0;
for (let i = 0; i < text.length && ti < input.length; i++) {
if (text[i].toLowerCase() === input[ti].toLowerCase()) {
ti++;
}
}
return ti === input.length;
}
Такой подход позволяет находить совпадения даже при неполном или неточном вводе.
filter: function(text, input) {
if (input.length < 2) return false;
return text.toLowerCase().includes(input.toLowerCase());
}
Используется для уменьшения количества результатов при коротком вводе.
Awesomplete по умолчанию может отображать весь список или скрывать его в зависимости от конфигурации. filter может полностью изменить это поведение:
filter: function(text, input) {
return input.trim().length > 0 && text.includes(input);
}
filter является центральным элементом логики автодополнения, определяющим базовую семантику поиска. Именно он задаёт границу между релевантными и нерелевантными элементами до применения сортировки и отображения, формируя основу пользовательского опыта взаимодействия с подсказками.