Параметр sort определяет стратегию упорядочивания
элементов выпадающего списка автодополнения. Он влияет на то, в каком
порядке отображаются совпавшие элементы после фильтрации исходного
набора данных.
По умолчанию механизм сортировки в Awesomplete ориентирован на повышение релевантности: элементы, более точно соответствующие введённой строке, поднимаются выше в списке. Это достигается через встроенный алгоритм сравнения, который учитывает близость совпадения, позицию совпадения внутри строки и другие эвристики.
sort представляет собой функцию-компаратор, аналогичную
используемой в стандартных алгоритмах сортировки Jav * aScript:
sort: function(a, b) {
return a.label.localeCompare(b.label);
}
Функция принимает два элемента списка и возвращает:
a должен идти раньше
ba должен идти позже
b0 — если порядок равнозначенЭлементы a и b могут быть как строками, так
и объектами с полями label и value, в
зависимости от структуры источника данных.
Внутреннее представление элементов в Awesomplete может быть приведено к двум основным формам:
["Apple", "Apricot", "Banana"]
[
{ label: "Apple", value: "apple" },
{ label: "Apricot", value: "apricot" }
]
В контексте сортировки обычно используется поле label,
поскольку именно оно участвует в отображении пользователю.
Сортировка может быть полностью отключена, что приводит к сохранению исходного порядка элементов:
sort: false
В этом режиме:
Такой режим полезен при работе с уже заранее отсортированными данными, например, полученными с сервера.
Основное применение параметра sort связано с
переопределением стандартного поведения. Возможны различные
стратегии.
sort: function(a, b) {
return a.label.localeCompare(b.label);
}
Используется при необходимости строгого лексикографического порядка без учёта релевантности ввода.
sort: function(a, b) {
const aStarts = a.label.startsWith(this.input.value);
const bStarts = b.label.startsWith(this.input.value);
if (aStarts && !bStarts) return -1;
if (!aStarts && bStarts) return 1;
return a.label.localeCompare(b.label);
}
Данный подход формирует двухуровневую систему приоритизации:
sort: function(a, b) {
return a.label.length - b.label.length;
}
Используется в сценариях, где предпочтение отдаётся более коротким значениям, например, кодам или идентификаторам.
Комбинированная стратегия учитывает сразу несколько факторов:
sort: function(a, b) {
const input = this.input.value.toLowerCase();
const aIndex = a.label.toLowerCase().indexOf(input);
const bIndex = b.label.toLowerCase().indexOf(input);
if (aIndex !== bIndex) {
return aIndex - bIndex;
}
return a.label.localeCompare(b.label);
}
Логика основана на позиционном совпадении подстроки внутри строки.
Функция sort вызывается после этапа фильтрации. Это
означает, что в неё уже поступает сокращённый список элементов,
соответствующих введённому запросу.
Последовательность обработки данных внутри Awesomplete:
sort (если определён)maxItems)Изменение параметра sort напрямую влияет на восприятие
качества автодополнения:
При некорректной реализации сортировки возможны побочные эффекты:
Сортировка выполняется при каждом изменении ввода, поэтому сложность алгоритма критична.
Рекомендации по вычислительной нагрузке:
sorttoLowerCase() и
localeCompare() в больших спискахПример оптимизации через предвычисление:
const prepared = list.map(item => ({
...item,
norm: item.label.toLowerCase()
}));
sort: function(a, b) {
return a.norm.localeCompare(b.norm);
}
Наиболее простой случай, сортировка выполняется напрямую через строковые операции.
Требуется явное указание поля (label, value
или пользовательское свойство).
Нежелательный сценарий, приводящий к непредсказуемым результатам;
требует нормализации структуры до применения sort.
filterФильтрация выполняется до сортировки, поэтому изменение
sort не влияет на критерии отбора, только на порядок.
maxItemsОбрезка списка происходит после сортировки, что делает порядок критически важным для финального результата.
autoFirstПри включённой опции первый элемент списка зависит напрямую от результата сортировки, так как именно он становится активным по умолчанию.
sortПри комбинации:
sort: false
filter: false
система возвращает исходный список без изменений порядка и без отбора по введённой строке, что фактически превращает выпадающий список в статический рендер полного массива данных.