【问题标题】:Fastest way to find out if an array of search terms includes a string also in my content?找出一组搜索词是否在我的内容中也包含字符串的最快方法?
【发布时间】:2013-09-09 23:56:33
【问题描述】:

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

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

["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”。以最快、最少计算量的方式完成它也很重要,因为我将连续调用这个函数数千次。我怎样才能最好地做到这一点?

【问题讨论】:

  • 每个函数调用都会有一些静态的东西,比如句子或搜索词或两者都在变化吗?
  • @plalx 恐怕不行。

标签: javascript arrays parsing search full-text-search


【解决方案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"]);

【讨论】:

  • 如果你想转义特殊字符以允许在搜索中使用它们 - 你应该像我在第一版中所做的那样在循环中手动添加它们,并像这里所做的那样转义它们 stackoverflow.com/questions/3446170/…
【解决方案2】:

有点类似于 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

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

【讨论】:

    【解决方案3】:

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

    function(needles, haystack){
        var x;
        for(x = 0; x < needles.length; x++){
            if(haystack.indexOf(needles[x]) > -1){
                return true;
            }
        }
        return false;
    }
    

    【讨论】:

    • 但他想要一场不偏不倚的比赛,所以这不是一个完整的解决方案。
    • 我的解决方案虽然可能不如正则表达式的其他解决方案那么有效,但仍然可以找到与 indexOf 的部分匹配。
    • +1 它可能没有其他解决方案那么快,但它确实完全解决了问题。我确实调查过它,我相信正则表达式的答案更快,但我认为最好有一个替代和简单的答案,以防正则表达式由于某种原因对某人不起作用。
    • 抱歉,我误解了您的代码。您可能应该清楚说明您使用的是 String 的 indexOf,而不是 Array 的。
    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2011-07-14
    • 2015-01-14
    • 2011-03-19
    相关资源
    最近更新 更多