在数组中搜索匹配项时优化javascript代码

在数组中搜索匹配项时优化javascript代码,javascript,optimization,Javascript,Optimization,基本上,我需要从包含在主字符串中的数组中获取单词 我有一个循环代码在这里,但我认为有一个一行做的把戏。 我需要优化的代码不仅在代码长度,而且在性能 谢谢 var aValidWords = ["ex", "exes", "expert", "experts", "expertise", "sex", "sexes", "exchange", "change", "changes"]; var sMainWord =

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

我有一个循环代码在这里,但我认为有一个一行做的把戏。 我需要优化的代码不仅在代码长度,而且在性能

谢谢

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 />"));
var aValidWords=[“ex”、“exes”、“expert”,
“专家”、“专家”、“性别”、“性别”,
“交换”、“变更”、“变更”];
var sMainWord=“expertsExchange”;
var aPossibleWords=新数组();
var sMainWordLower=sMainWord.toLowerCase();
对于(i=0;i”);

这个循环肯定比您现有的更简洁,但值得在各种浏览器中运行一些测试,以找出哪个更快。我认为正则表达式匹配可能更快,但我很好奇编译正则表达式是否会带来性能损失

for(var i=0; i<aValidWords.length; i++) {
    if (new RegExp(aValidWords[i], 'i').test(sMainWord))
        aPossibleWords.push(aValidWords[i]);
}

for(var i=0;i此循环肯定比您拥有的更简洁,但值得在各种浏览器中运行一些测试,以找出哪个更快。我认为正则表达式匹配可能更快,但我很好奇编译正则表达式是否会有任何性能损失

for(var i=0; i<aValidWords.length; i++) {
    if (new RegExp(aValidWords[i], 'i').test(sMainWord))
        aPossibleWords.push(aValidWords[i]);
}

for(var i=0;ii比较了三种可能的实现:

备选方案1-用于循环:

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;
}
备选方案3-使用JavaScript本机方法(IE9、Chrome、Firefox、Opera、Safari):

我用Chrome Profile工具测量了执行时间。每个备选方案用随机的milion单词数组执行了10次。结果如下:

  • 备选方案1:20次执行->21,68s
  • 备选方案2:执行20次->执行26,31次
  • 备选方案3:20次执行->34,66s
我感到惊讶的是,本机JavaScript函数的速度如此之慢

若您不想自己测量执行时间,那个么脚本需要一些时间才能完成

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

[更新] 对于结果的解释(为什么JQuery grep函数比原生JavaScript过滤器函数更快),请看一下这个。
代码也被移植到@Alexander。我比较了三种可能的实现:

备选方案1-用于循环:

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;
}
备选方案3-使用JavaScript本机方法(IE9、Chrome、Firefox、Opera、Safari):

我用Chrome Profile工具测量了执行时间。每个备选方案用随机的milion单词数组执行了10次。结果如下:

  • 备选方案1:20次执行->21,68s
  • 备选方案2:执行20次->执行26,31次
  • 备选方案3:20次执行->34,66s
我感到惊讶的是,本机JavaScript函数的速度如此之慢

若您不想自己测量执行时间,那个么脚本需要一些时间才能完成

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

[更新] 对于结果的解释(为什么JQuery grep函数比原生JavaScript过滤器函数更快),请看一下这个。
代码也被移植到了@Alexander。

我认为您的代码很不错

如果您真的担心性能,您可能需要尝试一些复杂的方法,例如。
但是,如果您只有少量的模式和相对较短的字符串,那么初始化开销将高于好处,因此您应该坚持使用简单的方法。请参阅Wikipedia的比较表

,我认为您的代码不错

如果您真的担心性能,您可能需要尝试一些复杂的方法,例如。
但是,如果你只有少量的模式和相对较短的字符串,那么初始化开销就比好处要高,因此你应该坚持使用简单的方法。请参阅Wikipedia的比较表

我的第一个想法是将数组转换为正则表达式。但这只会找到匹配的子字符串,而不会告诉你哪个是有效的已找到ORD。如果有效单词中没有重叠的子字符串就可以了,但子字符串很多。您可以创建一种映射表。由于“专家”本身包含“ex”、“专家”和“专家”,因此您只需处理“专家”要知道三个词是有效的。@asgoth的事情是,sMainWord会不时更改。我知道,但它独立于主词。假设您有这样的映射表(伪):(专家->专家,专家,ex),(专家->专家,ex),(交换->更改),…那么您只需要首先遍历最大的字,如果这些最大的字中的任何一个匹配,您也可以从映射表中删除较小的字。除非该映射表来自服务器,否则没有;)否则一个小优化:将新数组()替换为[]我的第一个想法是将数组转换为正则表达式。但这只会找到匹配的子字符串,而不会告诉您找到了哪些有效单词。如果有效单词中没有重叠的子字符串,那就可以了,但它们有很多。您可以创建一种映射表。因为“专家”包含“ex”、“专家”和“专家”就其本身而言,您只需处理“专家”就可以知道三个单词是有效的。@asgoth的情况是,sMainWord会不时更改。我知道,但它独立于主单词。假设您有这样的映射表(伪):(专家->专家)