JS-比较两个数组与indexOf

时间:2018-06-21 02:30:18

标签: javascript arrays string search indexof

我正在尝试建立一个文档搜索,该文档搜索说明了单词的片段和单词的不同顺序-例如,某人可能正在尝试查找该部分:

Level 6 Pathology

他们可以通过输入

进行搜索
Pathology Level 6
Level 6 Path
6 path

我还想确保结果中包含所有搜索词,以便

 level 6 path

不会在文档中打开每个包含“级别”的子标题。

为了满足这些要求,我将搜索输入字符串“级别”“ 6”“路径”组合到空格分隔的字符串“级别6路径”,“ 6级路径”,“路径6级别”的每种可能组合中等等

代码:

function search(){
            event.preventDefault();
            var results = [];
            var searchinput = document.getElementById("searchbar").value.toUpperCase().split((" "), 6);                
            var word = searchinput.join(" ");
            if (searchinput.length > 1){
                var searchinputExpanded = recurCombinations(searchinput.length, searchinput);
                searchinputExpanded.unshift(word);
            } else {
                var searchinputExpanded = searchinput;
            }
            var arrayofdivs = document.querySelectorAll(".collapsible");                
            var j, k, m;

            //Find every combination of the search input so that both
            //Level 6 Path and Path Level 6 will find Level 6 Pathology
            function recurCombinations(len, input){
                var i = 0;
                var l = len - 1;

                if(len === 1){
                    return;
                } else {
                    for(i; i < l; i++){
                        recurCombinations(l, input);
                        l % 2 ? input.swap(i, l) : input.swap(0,l); //even-odd check 
                        results.push(input.join(" ").toString());
                    }
                    recurCombinations(l, input);
                }
                return results.sort();
            }            

            //close any currently expanded divs
            for(m = 0; m < arrayofdivs.length; m++){                    
                arrayofdivs[m].style.backgroundColor = "#eee";
                arrayofdivs[m].style.color = "#2CB2FF";
                arrayofdivs[m].nextElementSibling.style.display = "none";
            }

            //expand any applicable results
            for(j = 0; j < arrayofdivs.length; j++){
                for(k = 0; k < searchinputExpanded.length; k++){                      

                    if(arrayofdivs[j].innerHTML.toUpperCase().indexOf(searchinputExpanded[k]) !== -1){                                                 

                        arrayofdivs[j].style.backgroundColor = "#555";
                        arrayofdivs[j].style.color = "#fff";
                        arrayofdivs[j].nextElementSibling.style.display = "block";
                        arrayofdivs[j].parentNode.style.display = "block";
                        document.getElementById("clearbutton").style.display = "block";                
                    }
                }
            }
        }           

我的这部分工作正常,但某些标题包含更多单词,但搜索并未说明这一点

Medical Imaging Level 5

将被发现

Level 5 Medical

但不是

Level 5 Imaging

在这种情况下,我认为大多数人将搜索“影像5级”而不是“医学5级”

我尝试过用单词的每种组合以获得可能的结果-基本上是:

 everyCombinationOfEveryPossibleResult.indexOf(everyCombinationOfSearchInput(path level 6) !== -1)

但是n!当某些可能的结果短语很长时,每个短语的可能性就太长了(由于这个原因,搜索输入被限制为6个字符串),并且会使浏览器崩溃。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果我的理解正确,那么您只想查找包含搜索词中所有单词的字符串,但是您不希望搜索词的顺序很重要。在这种情况下,您可以执行以下操作:

None

在该示例中,arrayToSearch应该是一个包含要搜索的所有标题的数组,searchTermsArray应该是要搜索的搜索词的数组(如果搜索词以字符串,您可以很容易地使用String function searchMyArray(arrayToSearch, searchTermsArray){ return arrayToSearch.filter(function(title){ return !searchTermsArray.some(function(word){ return title.indexOf(word) == -1; }); }); } 方法将其分为一个数组。该函数返回包含所有搜索词的标题列表。

该功能通过过滤掉搜索词中某些单词不在标题中的所有标题来起作用。

答案 1 :(得分:0)

该函数查找第一个单词,如果没有,则继续到下一个干草堆选项。如果找到了该单词,则它将继续深入搜索下一个单词。

function searchForIndex(needleArr,haystackArr){
 var temp = needleArr;
 for(var i = 0; i < haystackArr.length;i++){
  if (haystackArr[i].indexOf(temp.shift())> -1){
   if (temp.length ==0) {
    return i;
   } else {
    return searchForIndex(temp,haystackArr);
   }
  }
 }
 return -1;
}