2014-12-30 15 views
8

Używam Twittera typeahead.js 0.10.5 jako silnika sugestii. Działa wspaniale, z jednym wyjątkiem nie mogę uporządkować listy sugestii tak, jak chcę.Sortuj sugestie dotyczące typów z dokładnym wprowadzeniem na górę

Jako przykład:

  var data =[{"id":1,"value":"no need"}, 
         {"id":2,"value":"there is no need"}, 
         {"id":3,"value":"in the need of"}, 
         {"id":4,"value":"all I need"}, 
         {"id":5,"value":"need"}, 
         {"id":6,"value":"needs"}, 
         {"id":7,"value":"all he needs"}, 
         {"id":8,"value":"he needs"}, 
         {"id":9,"value":"they need"}, 
         {"id":10,"value":"you need"}] 

      var suggestion = new Bloodhound({ 
       datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), 
       queryTokenizer: Bloodhound.tokenizers.whitespace, 
       local: data, 
       limit: 20 
       }); 

       suggestion.initialize(); 

       $('.typeahead').typeahead({ 
       hint: true, 
       autoselect: true, 
       highlight: true, 
       minLength: 1 
       }, 
       { 
       name: 'suggestion', 
       displayKey: 'value', 
       source: suggestion.ttAdapter(), 
       templates: { 
       empty: [ 
        '<div class="empty-message">', 
        'no suggestion in this map', 
        '</div>' 
       ].join('\n'), 
       suggestion: Handlebars.compile('<p><span class="suggestion-text">{{value}}</span></p>') 
       } 

Po wpisaniu „trzeba” zrobić się sugestie zamówionych przez pozycję w tablicy, ale chciałbym mieć to sortowane według danych wejściowych, co oznacza, że ​​kolejność powinna być „Need "," potrzebuje "," wszystko czego potrzebuję "... Kiedy wpisujesz" on ", powinno być" on potrzebuje "," wszystko czego potrzebuje "," wszystko czego potrzebuję "itd.

Wiem, że Bloodhound ma sorter opcja, ale nie wiem, jak go użyć w tej konkretnej sytuacji.

Odpowiedz

12

Chcesz coś według tych zasad. Spowoduje to przesunięcie dokładnego dopasowania do góry. Będziesz chciał kontynuować modyfikowanie kodu sortownika, aby obsługiwał ciąg znaków, białe spacje i sposób, w jaki chcesz, aby nie były doskonałe, ale ścisłe, aby były obsługiwane. Powinno się zacząć.

 var suggestion = new Bloodhound({ 
      datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), 
      queryTokenizer: Bloodhound.tokenizers.whitespace, 
      local: data, 
      limit: 20, 
      sorter:function(a, b) { 

        //get input text 
       var InputString= $(Selector).val(); 

        //move exact matches to top 
       if(InputString==a.value){ return -1;} 
       if(InputString==b.value){return 1;} 

         //close match without case matching 
       if(InputString.toLowerCase() ==a.value.toLowerCase()){ return -1;} 
       if(InputString.toLowerCase()==b.value.toLowerCase()){return 1;} 

       if((InputString!=a.value) && (InputString!=b.value)){ 

         if (a.value < b.value) { 
         return -1; 
         } 
         else if (a.value > b.value) { 
         return 1; 
         } 
         else return 0; 
       } 
       }, 
      }); 
+0

Działa to dokładnie tak, jak tego chciałem! – lunacafu

+0

Czy ktoś może wyjaśnić dwie wartości przekazywane do funkcji (a, b)? Uruchomiłem dziennik konsoli i "a" okazało się obiektem JSON, ale nie mogłem dowiedzieć się, co to jest "b". –

+0

Jedyną różnicą między a i b jest to, że b będzie następnym obiektem w tablicy (bezpośrednio po) – NoDiced

7

Aby posortować wszystkie mecze, których autorem jest bliskość do wejścia, można wziąć Levenshtein distance z a i b. Właśnie zaimplementowałem to używając fast-levenshtein i działa i działa świetnie.

 sorter: function(a, b) { 
      var input_string = $(selector).val(); 
      return levenshtein.get(a.key, input_string) - levenshtein.get(b.key, input_string); 
     } 
+0

Eleganckie rozwiązanie i wielkości szybsze niż zaakceptowana odpowiedź. – eYe

+0

Czy "sorter" jest opcją w typie głowicy? Gdzie powinienem dodać twój fragment? – medley56