11

Twitter typeahead.js 0.10.5 を提案エンジンとして使用しています。それはうまく機能しますが、1 つの例外を除いて、提案のリストを思いどおりに並べ替えることができません。

例として:

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

「必要」と入力すると、配列内の位置順に並べられた提案が得られますが、入力順に並べたいと思います。つまり、順序は「必要」、「必要」、「必要なすべて」である必要があります... 「he」と入力すると、「he needs」、「all he needs」、「all I need」などになります。

Bloodhound にソーター オプションがあることは知っていますが、この特定の状況でそれを使用する方法がわかりません。

4

2 に答える 2

12

あなたはこれらの線に沿って何かが欲しい. これにより、完全一致が一番上に移動します。文字列の大文字と小文字、空白、および完全ではないが近い一致を処理する方法を処理するために、ソーター コードを引き続き変更する必要があります。これで作業を開始できます。

        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;
                 }
              },
          });
于 2015-01-05T09:34:09.837 に答える
11

すべての一致を入力への近さで並べ替えるには、とのレーベンシュタイン距離を取ることができます。fast-levenshteinを使用してこれを実装したところ、機能し、優れたパフォーマンスを発揮します。ab

        sorter: function(a, b) {
            var input_string = $(selector).val();
            return levenshtein.get(a.key, input_string) - levenshtein.get(b.key, input_string);
        }
于 2016-05-18T17:14:00.343 に答える