Ordinamento dei risultati dell’interfaccia utente di completamento automatico in base alla posizione della corrispondenza

Vorrei ordinare i risultati dell’interfaccia utente di completamento automatico jQuery in base a dove nella stringa si verifica la corrispondenza. I risultati in cui la corrispondenza è la prima lettera devono avere la priorità rispetto ai risultati in cui la corrispondenza è nel mezzo della stringa.

Una ricerca per “M” dovrebbe restituire:

Matt, Michael, Sam, Tim, Adam, Benjamin

Invece, dato che ora restituisco gli articoli in ordine alfabetico, sto ricevendo questo:

Adam, Benjamin, Matt, Michael, Sam, Tim

Sfortunatamente, sembra che l’UI di completamento automatico non abbia opzioni per fare qualcosa di simile, ma presenta semplicemente i risultati nell’ordine in cui li ha ricevuti. Avere MySql fare l’ordinamento non è un’opzione, dal momento che tutte le possibili corrispondenze sono precaricate in modo tale da non effettuare chiamate al database con ogni sequenza di tasti. Qualcuno ha fatto qualcosa del genere?

Puoi fornire qualsiasi logica di filtraggio locale che desideri fornendo all’opzione di source una funzione anziché una semplice matrice. Ecco un rapido esempio che farà le basi di ciò che desideri:

 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)); } }); 

Esempio: http://jsfiddle.net/zkVrs/

Fondamentalmente, la logica è quella di creare una serie di corrispondenze che iniziano con il termine, quindi concatenarlo con corrispondenze che contengono il termine ma non iniziano con esso.

Le prestazioni potrebbero essere un problema qui, specialmente con la chiamata $.inArray . Potrebbe essere un modo migliore per realizzare quella porzione, ma spero che ti dia un buon punto di partenza.

Una ansible ottimizzazione: selezionare gli elementi dall’elenco sorgente mentre iniziano con. Con, e quindi non è necessario testare la ripetizione quando si aggiungono elementi che contengono la stringa di ricerca. Tuttavia, il compromesso è che l’array sorgente dovrebbe essere rigenerato ogni volta che la stringa di input cambia.

Sembra avere problemi quando gli spazi sono presenti tra le parole, prova come segue

  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 "]