0

基本上,我需要从包含在主字符串中的数组中获取单词

我在这里有一个循环代码,但我认为有一个单行代码可以做到这一点。我需要对代码进行优化,不仅要优化代码长度,还要优化性能。

谢谢

var aValidWords = ["ex", "exes", "expert", 
                   "experts", "expertise", "sex", "sexes", 
                   "exchange", "change", "changes"];
var sMainWord = "expertsExchange";
var aPossibleWords = new Array();

var sMainWordLower = sMainWord.toLowerCase();
for(i=0; i < aValidWords.length; i++){
    var sCurrentWord = aValidWords[i].toLowerCase();
    if(sMainWordLower.indexOf(sCurrentWord) != -1){
        aPossibleWords.push(aValidWords[i]);
    }
}

document.write(aPossibleWords.join("<br />"));
4

3 回答 3

3

我比较了三种可能的实现:

备选方案 1 - 使用 for 循环:

function alternative1(aValidWords, sMainWordLower) {
    var aPossibleWords1 = [];
    for(i=0; i < aValidWords.length; i++){
        if(sMainWordLower.indexOf(aValidWords[i]) != -1){
            aPossibleWords1.push(aValidWords[i]);
        }
    }
    return aPossibleWords1;
}

备选方案 2 - 使用 jQuery grep函数:

function alternative2(aValidWords, sMainWordLower) {
    return $.grep(aValidWords, function(word) {
              return sMainWordLower.indexOf(word) != -1;                    
         }
    )
}

备选方案 3 - 使用 JavaScript 原生过滤方法(IE9、Chrome、Firefox、Opera、Safari):

function alternative3(aValidWords, sMainWordLower) {
    return aValidWords.filter(function(word) {
              return sMainWordLower.indexOf(word) != -1;                    
         }
    )
}

我用 Chrome Profile 工具测量了执行时间。每个备选方案使用随机的百万字数组执行 10 次。结果是:

  • 备选方案1:20 次执行 -> 21,68 秒
  • 备选方案2:20 次处决 -> 26,31 秒
  • 备选方案3:20 次处决 -> 34,66 秒

令我惊讶的是,原生 JavaScript过滤器功能如此之慢。

如果您不想自己测量执行时间,可以使用 jsFiddle - 脚本需要一些时间才能完成。

一般来说,这三种选择是最简单的。如果这些执行时间适合您,请使用其中之一,否则@Pumbaa80 的答案是正确的。

[更新]

有关结果的解释(为什么 JQuery grep 函数比原生 JavaScript 过滤函数更快),请查看这个问题/答案感谢@Alexander, jsFiddle代码也被移植到了jsPerf

于 2012-12-23T16:43:50.507 回答
1

这个循环肯定比你所拥有的更简洁,但值得在各种浏览器中运行一些测试以找出哪个更快。我想正则表达式匹配可能更快,但我很好奇编译正则表达式是否会降低性能。

for(var i=0; i<aValidWords.length; i++) {
    if (new RegExp(aValidWords[i], 'i').test(sMainWord))
        aPossibleWords.push(aValidWords[i]);
}
于 2012-12-23T16:21:20.817 回答
1

我认为你的代码很不错。

If you're really worried about performance, you may want to try some sophisticated method like Boyer-Moore. But, if you just have a handful of patterns and relatively short strings, then the initialization overhead is higher than the benefit, so you should stick with the simple approach. See Wikipedia's comparison table http://en.wikipedia.org/wiki/String_searching_algorithm#Single_pattern_algorithms

于 2012-12-23T17:01:41.737 回答