我如何更快地匹配这个文本?

我正在为名字build立一个自动build议。 当用户在文本框中input时,它会碰到服务器并运行:

var names = [ list of 1000 names ]; //I have a list of 1000 names, this is static. var query = 'alex'; var matched_names = []; //This is when it gets slow.... names.forEach(function(name){ if(name.indexOf(query) >= 0){ matched_names.push(name); } }); return matched_names; 

我怎样才能使这个更快? 我正在使用Node.js

如果名称是静态的,那么将这些代码移动到客户端并在那里运行。 在服务器上运行这样的代码的唯一原因是数据源在某种程度上是dynamic的。

做这个逻辑客户端将大大提高性能。

您可能应该使用filter ,因为它是本地的:

 var names = [ /* list of 1000 names */ ]; var query = 'alex'; var matched_names = names.filter(function(name) { return name.indexOf(query) > -1; }); return matched_names; 

如果按照sorting顺序存储名称,则可以使用二分查找来查找sorting顺序中的名称区域,该sorting顺序以用户迄今input的名称片段开始,而不是逐个检查所有名称。

在一个有着相当奇怪的编程语言的系统中,我希望find包含用户迄今在任何位置input的所有匹配,通过重新激活http://en.wikipedia.org ,我得到了一个令人满意的结果。 / wiki / Key_Word_in_Context 。 (在大学学习之后,我通过一个实际的KWIC索引进行search,从一个IBM行式打印机打印出来,然后作为一个文档来绑定这个目的。

我build议你在客户端做这个东西,并且宁愿(现在)使用while循环而不是filter / forEach方法:

 var names = [ /* list of 1000 names */ ] , query = 'alex' , i = names.length , matched_names = []; while(i--){ if(names[i].indexOf(query) > -1){ matched_names.push(names[i]); } } return matched_names; 

这将更快(即使本机支持filter / forEach)。 看到这个基准: http : //jsperf.com/function-loops/4