Как ограничить совпадения с автозаполнением ванильного javascript?

Я создал функцию «нравится/не нравится» для своего приложения Django.

Он использует jQuery/ajax и работает нормально, но нарушает мой поиск автозаполнения Devbridge (https://github.com/devbridge/jQuery-Автозаполнение).

Я решил заменить автозаполнение Devbridge автозаполнением vanilla JS отсюда: https://www.w3schools.com/howto/howto_js_autocomplete.asp.

Проблема в том, что в моем массиве более 10 000 элементов, поэтому, когда вы вводите первые несколько букв, он дает сотни или тысячи совпадений.

Я хотел бы ограничить количество совпадений. Любая помощь очень ценится. Я включил то, что, как я предполагаю, является наиболее подходящим кодом. Для полного кода просто проверьте ссылку.

<script>
function autocomplete(inp, arr) {
  /*the autocomplete function takes two arguments,
  the text field element and an array of possible autocompleted values:*/

var currentFocus;
  /*execute a function when someone writes in the text field:*/
  inp.addEventListener("input", function(e) {
  var a, b, i, val = this.value;
  /*close any already open lists of autocompleted values*/
  closeAllLists();
  if (!val) { return false;}
  currentFocus = -1;
  /*create a DIV element that will contain the items (values):*/
  a = document.createElement("DIV");
  a.setAttribute("id", this.id + "autocomplete-list");
  a.setAttribute("class", "autocomplete-items");
  /*append the DIV element as a child of the autocomplete container:*/
  this.parentNode.appendChild(a);
  /*for each item in the array...*/
  for (i = 0; i < arr.length; i++) {
    /*check if the item starts with the same letters as the text field value:*/
    if (arr[i].substr(0, val.length).toUpperCase() == val.toUpperCase()) {
      /*create a DIV element for each matching element:*/
      b = document.createElement("DIV");
      /*make the matching letters bold:*/
      b.innerHTML = "<strong>" + arr[i].substr(0, val.length) + "</strong>";
      b.innerHTML += arr[i].substr(val.length);
      /*insert a input field that will hold the current array item's value:*/
      b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>";
      /*execute a function when someone clicks on the item value (DIV element):*/
      b.addEventListener("click", function(e) {
          /*insert the value for the autocomplete text field:*/
          inp.value = this.getElementsByTagName("input")[0].value;
          /*close the list of autocompleted values,
          (or any other open lists of autocompleted values:*/
          closeAllLists();
      });
      a.appendChild(b);
    }
  }
  });

Не могли бы вы добавить больше минимального и конкретного кода и сделать его более читабельным, пожалуйста?

Manoj Choudhari 01.02.2019 18:33

Не совсем. Этот вопрос сложный. Ответить на него сможет только настоящий знаток Javascript. Как я уже сказал, в моем посте для расшифровки всего блока кода вам, вероятно, придется посетить исходную страницу.

crappy_hacker 01.02.2019 18:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

The problem is I have over 10,000 items in my array, so when you type in the first few letters it produces 100s or thousands of matches... I'd like to limit the number of matches.

Итак, давайте выясним, где он перебирает элементы в массиве, и добавим верхний предел количества элементов, которые можно добавить в список.

// This is where it loops all the items in the array
for (i = 0; i < arr.length; i++) {

    ...

    // This is the logic which will dictate if an item is added to the list
    if (arr[i].substr(0, val.length).toUpperCase() == val.toUpperCase()) {
        ...
    }
}

Давайте добавим ограничение на количество совпадений, которые можно добавить в список, выйдя из цикла после достижения верхней границы.

let maxMatches = 10;
let matches = 0;
// Stop this loop once maximum matches have been found
for (i = 0; i < arr.length; i++) {
    ...

    // This is the logic which will dictate if an item is added to the list
    if (arr[i].substr(0, val.length).toUpperCase() == val.toUpperCase()) {
        // Another match has been found, increment counter
        matches = matches + 1;
        ...
    }

    // Break the loop if we hit max number of matches
    if (matches >= maxMatches) {
        break;
    }
}

Надеюсь это поможет!

Решил проблему. Потрясающий. Спасибо!

crappy_hacker 01.02.2019 19:03

Другие вопросы по теме