1

我正在尝试创建一个搜索框,当用户输入他们的搜索词时,它会不断评估搜索词是否在我的内容中。

我有一系列搜索词和短语,例如:

["home", "and", "garden", "weeding a flower patch", "best tools"]

我还有一个字符串,其中包含我正在搜索的内容,例如:

"Using your hands to dig your flower holes brings you closer to the earth."

在 Javascript 中,我需要查看是否有任何搜索词在此字符串的任何部分中。我不需要知道哪些字词匹配或在哪里匹配,只要该字符串中的某个位置至少是我的搜索字词之一的一个实例。尽管它还在内容字符串中找到部分匹配项,但这一点非常重要。例如,在上面的示例中,它应该返回 true,因为单词“hands”包含我的搜索词中的单词“and”。以最快、最少计算量的方式完成它也很重要,因为我将连续调用这个函数数千次。我怎样才能最好地做到这一点?

4

3 回答 3

4

有点类似于 Almog Baku 的解决方案是我会怎么做:

var makeSearcher = function(terms) {
    var regex = new RegExp(terms.join("|"));
    return function(str) {
        return regex.test(str);
    };
};

var searcher = makeSearcher(["home", "and", "garden", 
                             "weeding a flower patch", "best tools"]);

searcher("Using your hands to dig ...");  //=> true
searcher("Using your fingers to dig ..."); //=> false

仅当您的搜索词不包含任何正则表达式中的特殊字符时,此技术才有效。但我认为它可能相当有效,假设您的搜索词是相对固定的。

于 2013-09-06T02:10:34.137 回答
1

我的建议很简单:

为了最好的部分(=更快!)我们应该建立一个正则表达式,而不是我们可以简单地使用搜索功能。

String.prototype.arraySearch = function(terms) {
    var regex = new RegExp(terms.join("|"));
    return regex.test(this);
}

比你可以只搜索你的字符串:

var text = "Using your hands to dig your flower holes brings you closer to the earth.";
var keywords = ["home", "and", "garden", "weeding a flower patch", "best tools"];
console.log(text.arraySearch(keywords);

//or even
"Using your hands to dig your flower holes brings you closer to the earth.".arraySearch(["home", "and", "garden", "weeding a flower patch", "best tools"]);
于 2013-09-06T01:51:56.003 回答
0

您可以遍历搜索词并使用 JavaScript 的 indexOf 函数来检查搜索词是否存在于字符串中,如下所示:

function(needles, haystack){
    var x;
    for(x = 0; x < needles.length; x++){
        if(haystack.indexOf(needles[x]) > -1){
            return true;
        }
    }
    return false;
}
于 2013-09-06T01:48:09.727 回答