7
votes

Tri des résultats de l'interface utilisateur automatique basée sur l'emplacement de match

J'aimerais trier mes résultats de l'interface utilisateur JQuery Autocomplecte basé sur l'endroit où dans la chaîne, la correspondance se produit. Les résultats où la correspondance est la première lettre doit être priorisé ci-dessus les résultats dans lesquels la correspondance est au milieu de la chaîne.

Une recherche de "m" devrait revenir:

Matt, Michael, Sam, Tim, Adam, Benjamin

Au lieu de cela, puisqu'il retourne actuellement les articles dans l'ordre alphabétique, je reçois ceci:

Adam, Benjamin, Matt, Michael, Sam, Tim

Malheureusement, il semble que l'interface utilisateur automatique n'a pas de possibilités de faire quelque chose comme ça, mais cela présente simplement les résultats dans l'ordre dans lequel elle les a reçues. Avoir MySQL faire le tri n'est pas une option car toutes les correspondances possibles sont préchargées de manière à ce que je ne passe pas des appels dans la base de données avec chaque frappe. Quelqu'un a-t-il fait quelque chose comme ça?


0 commentaires

3 Réponses :


17
votes

Vous pouvez fournir une logique de filtrage locale que vous souhaitez en fournissant la fonction source une fonction à la place d'un tableau simple. Voici un exemple rapide qui fera les bases de ce que vous voulez: xxx

Exemple: http://jsfiddle.net/zkvrs/

Fondamentalement, la logique consiste à accumuler une gamme de correspondances qui commencent avec le terme, puis concaténent qu'avec des correspondances contenant le terme Mais ne commencez pas avec cela.

performance pourrait être un problème ici, en particulier avec le $. Inarray appel. Pourrait être un meilleur moyen d'accomplir cette partie, mais j'espère que cela vous donnera un bon point de départ.


10 commentaires

Ah, ça a du sens. Voici ma variation de votre idée: Source: fonction (demande, réponse) {var résultats = jquery.ui.autocomplete.filter (données, demande.term); Résultats = résultats.sort (Fonction (A, B) {renvoyer A.TITle.TolowerCase (). Indexof (requête.Term.Tolows ()) - b.title.tolowercase (). indexof (demande.term.tolowercase () );}); réponse (résultats.slice (0,10)); }


@ blim8183: Yep, cela fonctionnerait certainement aussi et pourrait être plus rapide


Oi, existe-t-il un moyen de formater le code dans les commentaires? C'est presque illisible, content que vous puissiez le déchiffrer. Merci pour ton aide!


@ blim8183: chose bien sûr! Il suffit d'utiliser le backtk (`)


Mais cela ne semble pas fonctionner pour plusieurs valeurs, JQuery Autocomplete. ??


@Javierbrooklyn je ne suis pas sûr, je ne l'ai pas écrit avec ça à l'esprit. Cela pourrait valoir la peine d'ouvrir une autre question si vous rencontrez des problèmes.


Voici le lien vers la question qui concerne la valeur multiple jQuery autocomplete - Stackoverflow.com/Questtions/14784794/...


@HAYATHHAYATHMS: content que cela ait aidé!


Pouvez-vous répondre à cette question similaire Stackoverflow .com / questions / 38857001 / ... \


@ Blim8183, votre code ne fonctionne pas lorsque le terme de demande n'est pas trouvé, car indexof retournera -1, et le terme sera donc toujours au début. Je l'ai donc changé de cette façon: résultats = résultats.sort (Fonction (A, B) { var Posa = A.Produit.tolowercase (). Indexof (demande.term.tolowercase () ); var posb = b.produit.tolowercase (). Indexof (requête.term.tolowercase ()); si (POSA == -1) POSA = 1000; si (posb == -1) posb = 1000; retour POSA - POSB; });



0
votes

Une optimisation possible: CULL Les éléments de la liste des sources au fur et à mesure qu'ils entrent dans StartSwewith, puis vous n'avez pas besoin de tester la répétition lorsque vous appendez des éléments contenant la chaîne de recherche. Cependant, le compromis est que le réseau source devrait être régénéré à chaque fois que la chaîne d'entrée a changé.


3 commentaires

Cela ferait un meilleur commentaire (bien que je connaisse que vous ne pouvez pas encore commenter :))


Je voulais le poster comme un commentaire. Mais comme tu le dis.


Mieux encore, en termes de déduction, est d'utiliser ce linge slick one-liner pour le nettoyer après le fait. gist.github.com/jasdeepkhalsa/5227812



0
votes

Il semble avoir des problèmes lorsque des espaces sont présents entre les mots, veuillez essayer ce qui suit comme source xxx


0 commentaires