Сортировка результатов автозаполнения интерфейса пользователя в зависимости от местоположения совпадения - PullRequest
6 голосов
/ 29 ноября 2011

Я хочу отсортировать результаты своего пользовательского интерфейса jQuery Autocomplete по месту в строке совпадения. Результаты, в которых совпадение является первой буквой, должны иметь приоритет над результатами, в которых совпадение находится в середине строки.

Поиск «M» должен вернуть:

Мэтт, Майкл, Сэм, Тим, Адам, Бенджамин

Вместо этого, поскольку сейчас он просто возвращает элементы в алфавитном порядке, я получаю следующее:

Адам, Бенджамин, Мэтт, Майкл, Сэм, Тим

К сожалению, похоже, что в интерфейсе автозаполнения нет никаких опций для выполнения чего-то подобного, вместо этого он просто представляет результаты в порядке их получения. Сортировка MySql невозможна, так как все возможные совпадения предварительно загружены, поэтому я не делаю звонки в базу данных при каждом нажатии клавиши. Кто-нибудь сделал что-нибудь подобное?

Ответы [ 3 ]

16 голосов
/ 29 ноября 2011

Вы можете предоставить любую локальную логику фильтрации, если захотите, предоставив опции source функцию вместо простого массива.Вот быстрый пример, который сделает основы того, что вы хотите:

var source = ['Adam', 'Benjamin', 'Matt', 'Michael', 'Sam', 'Tim'];
$("input").autocomplete({
    source: function (request, response) {
        var term = $.ui.autocomplete.escapeRegex(request.term)
            , startsWithMatcher = new RegExp("^" + term, "i")
            , startsWith = $.grep(source, function(value) {
                return startsWithMatcher.test(value.label || value.value || value);
            })
            , containsMatcher = new RegExp(term, "i")
            , contains = $.grep(source, function (value) {
                return $.inArray(value, startsWith) < 0 &&
                    containsMatcher.test(value.label || value.value || value);
            });

        response(startsWith.concat(contains));
    }
});

Пример: http://jsfiddle.net/zkVrs/

По сути, логика заключается в создании массивасовпадений, которые начинаются с термина, а затем объединяются с совпадениями, которые содержат термин, но не начинаются с него.

Производительность может быть проблемой здесь, особенно с вызовом $.inArray.Может быть, лучший способ выполнить эту часть, но, надеюсь, это даст вам хорошую отправную точку.

0 голосов
/ 25 июня 2015

Кажется, что есть проблемы, когда между словами есть пробелы, пожалуйста, попробуйте следующее как источник

    source=[" Family And Community " , 
" Finance And Legal " , 
" Food And Beverages " , 
" Government " , 
" Health And Medicine " , 
" Home And Garden " , 
" Industrial Supplies And Services " ,
 " Non-governmental Organisations (ngos) " , 
" Personal Care " , 
" Public Utilities And Environment " , 
" Real-estate And Insurance " , 
" Religious Organisations And Associations " , 
" Shopping And Specialty Stores " , 
" Sports And Recreation " ,
 " Transportation " , 
" Travel And Tourism " , 
" Farming " , 
" Farming Equipments And Services " , 
" Feed, Seed And Grain " , 
" Fishing " , 
" Fishing Equipments And Services " , 
" Forests " , 
" Timber Equipments And Services " , 
" General Supplies And Services " , 
" Livestock " , 
" Wildlive " , 
" Minerals And Organic Matte " , 
" Accessories " , 
" Detailing And Aesthetics " , 
" Motorcycles " , 
" Motorised Vehicles " , 
" New And Used Dealers " , 
" Parts And Supplies " , 
" Related Services " , 
" Repairs Body Work " , 
" Repairs Mechanical " , 
" Trailers " , 
" Administrative And Specialty Services " , 
" Advertising " , 
" Associations - Organisations " , 
" Communication And Audio-visual " , 
" Consultants " , 
" Document Services " , 
" Employment And Career Resources " , 
" Engineers " , 
" Furniture And Office - Industrial Machines " , 
" Import And Export Services " , 
" Lawyers " , 
" Marketing And Sales " , 
" Office Supplies - General " , 
" Printing, Publishing And Copying " , 
" Shipping, Packaging And Postal Services " , 
" Trade Shows, Expositions And Conventions " , 
" Alterations And Services " , 
" Clothing - General " , 
" Clothes And Fashion Accessories " , 
" Footwear " , 
" Outerwear " , 
" Uniforms And Work Clothing " , 
" Communications Services And Equipments " , 
" Computer Equipments " , 
" Computer Services " , 
" Electronics - Services And Equipments " , 
" Information Systems " , 
" Internet - Communication And Events " , 
" Internet - Development And Services " , 
" Building Materials And Equipments " , 
" Ceramics And Tiles " , 
" Chimneys " , 
" Concrete, Cement And Paving " , 
" Contractor Equipments And Services " , 
" Design And Architecture " , 
" Electrical Products And Services " , 
" Floors, Ceilings And Roofs " , 
" Foundations And Piling " , 
" Hardware - Supplies And Services " , 
" Heavy Construction And Equipments " , 
" Inspectors And Surveyors " , 
" Painting And Plastering " , 
" Plumbing And Piping " , 
" Academic " , 
" Libraries " , 
" Services And Supplies " , 
" Specialised Schools "]
0 голосов
/ 16 января 2014

Возможная оптимизация: отбирать элементы из списка источников по мере их поступления в StartWith, и вам не нужно проверять повторение при добавлении вещей, которые содержат строку поиска. Однако компромисс заключается в том, что исходный массив необходимо будет заново генерировать каждый раз, когда изменяется входная строка.

...