#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>