Попытка выполнить поиск в подмножестве поиска или поиска, содержащего все ключевые слова

#javascript #angular

#javascript #angular

Вопрос:

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

Красный дом, красная машина, домашний гараж для вашего автомобиля

В окне поиска (которое в настоящее время является динамическим по мере ввода), если вы введете Red, вы получите первые два выше. Если я наберу Red, Car, я должен получить только вторую строку, Red Car, потому что это единственная строка, в которой есть и red, и car.

Я попытался создать массив элементов поиска, затем у меня есть это для окна поиска:

      $scope.search = function(item) {
    var str = $scope.searchText;
    if(!str || str === undefined) {
        return true;
    } 

    if (!item || item === undefined) return false;

    var arr = str.toString().split(' ');
    console.log('ARRAY - '   arr);
    var found = true;
    arr.forEach(function(element) {
        console.log ( "Element "   element.toString()) ;
         if(item.tags.toString().toLowerCase().indexOf(element.toLowerCase()) >= 0 ) {
            console.log ("Tags "   item.tags.toString()) ;
            found = true;
            return true;
        }

        found = false;
        return false;
    });

    return found;
  

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

Не уверен, насколько я далек от этого.

Ответ №1:

Вы должны использовать Array.prototype.every для проверки того, что каждое слово проходит проверку. Вы также можете извлечь строчные теги перед циклом, чтобы это не выполнялось в каждом цикле без необходимости:

 const lowerTags = item.tags.toString().toLowerCase();
const arr = str.toString().split(' ');
const haveAll = arr.every(wordToFind => lowerTags.includes(wordToFind.toLowerCase()));
return haveAll;
  

Если str это уже строка, нет необходимости вызывать toString() для нее (и аналогично для item.tags ) — может сделать код более читаемым.

Ответ №2:

Следующий скрипт содержит массив строк, доступных для поиска. Когда вызывается функция Search, она принимает строку в качестве аргумента. Эта строка разбивается на элементы массива для различных слов в строке. Затем функция перебирает каждый поисковый запрос и сравнивает его с каждым доступным для поиска элементом. Если элемент и термин совпадают, термин помещается в массив результатов, который функция вернет для вас, чтобы использовать по своему усмотрению.

 <script>

searchableItems = [
    "The Red House",
    "The Red Car",
    "Home Garage For Your Car"
];


Search("Red");

function Search(searchTerm){
    results = [];

    searchWords = searchTerm.split();

    i = 0;
    while(i < searchWords.length){
        j = 0;
        while(j < searchableItems.length){

            if(searchableItems[j].indexOf(searchWords[i]) > -1){

                results.push(searchableItems[j]);
            }

            j  ;
        }

        i  ;
    }

    return results;
}

</script>