簡體   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