繁体   English   中英

JS-比较两个数组与indexOf

[英]JS - Comparing two arrays with 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)

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

任何帮助,将不胜感激。

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

function searchMyArray(arrayToSearch, searchTermsArray){
    return arrayToSearch.filter(function(title){
        return !searchTermsArray.some(function(word){
            return title.indexOf(word) == -1;
        });
    });
}

在该示例中,arrayToSearch应该是一个包含要搜索的所有标题的数组,searchTermsArray应该是要搜索的搜索项的数组(如果搜索项以字符串形式出现,则表示可以很容易地用String split方法将其分成一个数组)。 该函数返回包含所有搜索词的标题列表。

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

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

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM