Формула пользовательского соответствия для EasyAutocomplete - PullRequest
0 голосов
/ 19 октября 2018

Я использую плагин JS под названием EasyAutocomplete для обработки расширенного автоматического предложения на моем веб-сайте.Он поддерживает удаленные наборы данных (JSON, XML, простой текст) и использует вызовы методов ajax для поиска, сортировки и сопоставления фразы ответа.

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

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

Допустим, мой удаленный набор данных содержит:

"Market Street "
" Market Thestreet Lane "
" Street South Road "

Если мой поиск -" Street ", то по функциональности плагина по умолчанию будут показаны все 3 результата, потому чтоСлово "улица" составляет часть каждого из этих 3 результатов.(Демонстрация ниже)

Я нашел похожий вопрос к моему на репозитории Github плагина ( и ответ от автора плагина ), но этот вопрос был для соответствия только началу каждого результатаэлемент (не каждое слово в каждом элементе результата).Так что, если мой поиск "Улица", будет показан только третий результат.(Демонстрация ниже)

Мой вопрос касается формулы соответствия, которая ищет начало любого слова в элементе результата.Итак, если мой поиск «Улица», первый и третий результаты будут отображаться.


Вот как плагин работает по умолчанию (я закомментировал формулу пользовательского соответствия):

jQuery(document).ready(function($) {
  
  var options = {
    data: [
  {"name": "Market Street", "parent": "Dog Management", "link": "https://marketstreet.com"},
  {"name": "Market Thestreet Lane", "parent": "Dog Management", "link": "https://marketlane.com"},
  {"name": "Street South Road", "parent": "Cat Management", "link": "https://streetsouthroad.com"}
],
    getValue: "name",
    list: {	
      match: {
        enabled: true,
/*
          method:  function(element, phrase) {
           if(element.indexOf(phrase) === 0) {
             return true;
           } else {
             return false;
           }
         }
*/
       },
      onSelectItemEvent: function() {
        var selectedItemValue = $("#companies").getSelectedItemData().parent;
        var selectedItemLink = $("#companies").getSelectedItemData().link;
        $("#company_result").html('<a href="'+selectedItemLink+'">Contact '+selectedItemValue+'</a>').trigger("change");
      },
    },    
    template: {
  		type: "description",
  		fields: {
  			description: "parent"
  		}
  	}    
  };
  $("#companies").easyAutocomplete(options);

});
<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>
<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css'>
<link rel='stylesheet' href='https://d3vv6lp55qjaqc.cloudfront.net/items/040r1I2Y1K3T3w3L3i3E/easy-autocomplete.css'>


<script src='https://code.jquery.com/jquery-1.11.2.min.js'></script>
<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>
<script src='https://d3vv6lp55qjaqc.cloudfront.net/items/2Q0s1P3D0D2i3u0M1m1x/jquery.easy-autocomplete.min.js'></script>

<div class="container">
   <br>
    <div class="row">
        <div class="col-md-8 col-offset-3">
          <p>Search for "Street"</p>
              <form style="text-align: center; margin: 0 auto;" onkeypress="return event.keyCode != 13;">
      <input class="form-control" id="companies" placeholder="Type your resort property name..."/>
      <div id="company_result"></div>
    </form>
        </div>
    </div>
</div>

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

jQuery(document).ready(function($) {
  
  var options = {
    data: [
  {"name": "Market Street", "parent": "Dog Management", "link": "https://marketstreet.com"},
  {"name": "Market Thestreet Lane", "parent": "Dog Management", "link": "https://marketlane.com"},
  {"name": "Street South Road", "parent": "Cat Management", "link": "https://streetsouthroad.com"}
],
    getValue: "name",
    list: {	
      match: {
        enabled: true,
          method:  function(element, phrase) {
           if(element.indexOf(phrase) === 0) {
             return true;
           } else {
             return false;
           }
         }
       },
      onSelectItemEvent: function() {
        var selectedItemValue = $("#companies").getSelectedItemData().parent;
        var selectedItemLink = $("#companies").getSelectedItemData().link;
        $("#company_result").html('<a href="'+selectedItemLink+'">Contact '+selectedItemValue+'</a>').trigger("change");
      },
    },    
    template: {
  		type: "description",
  		fields: {
  			description: "parent"
  		}
  	}    
  };
  $("#companies").easyAutocomplete(options);

});
<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>
<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css'>
<link rel='stylesheet' href='https://d3vv6lp55qjaqc.cloudfront.net/items/040r1I2Y1K3T3w3L3i3E/easy-autocomplete.css'>


<script src='https://code.jquery.com/jquery-1.11.2.min.js'></script>
<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>
<script src='https://d3vv6lp55qjaqc.cloudfront.net/items/2Q0s1P3D0D2i3u0M1m1x/jquery.easy-autocomplete.min.js'></script>

<div class="container">
   <br>
    <div class="row">
        <div class="col-md-8 col-offset-3">
          <p>Search for "Street"</p>
              <form style="text-align: center; margin: 0 auto;" onkeypress="return event.keyCode != 13;">
      <input class="form-control" id="companies" placeholder="Type your resort property name..."/>
      <div id="company_result"></div>
    </form>
        </div>
    </div>
</div>

Спасибо!

1 Ответ

0 голосов
/ 19 октября 2018
method: function(element, phrase) {
  return !!element.toLowerCase().split(" ").filter((word) => word.indexOf(phrase.toLowerCase()) === 0).length;
}

Эта функция:

  • Делает элемент строчным (без проблем с заглавными буквами)
  • Разбивает его на слова
  • Отфильтровывает любые слова, которые нене начинать с заданного ввода

Если в фильтрованном массиве есть какие-либо элементы, он должен совпадать.В противном случае это не так.Вот для чего нужна проверка .length.

...