如果不进行一些改变,是无法加快初始数组查找速度的。但你可以通过缓存结果并动态映射它们到模式来加快连续查找的速度。
1.) 调整数据格式。这会使初始查找速度更快。基本上,你会预先缓存。
var data = {
a : ['Ant farm', 'Ant massage parlor'],
b : ['Bat farm', 'Bat massage parlor']
}
2.) 设置缓存机制。
var searchFor = function(str, list, caseSensitive, reduce){
str = str.replace(/(?:^\s*|\s*$)/g, '');
var found = [];
var reg = new RegExp('^\\s?'+str, 'g' + caseSensitive ? '':'i');
var i = list.length;
while(i--){
if(reg.test(list[i])) found.push(list[i]);
reduce && list.splice(i, 1);
}
}
var lookUp = function(str, caseSensitive){
str = str.replace(/(?:^\s*|\s*$)/g, '');
if(data[str]) return cache[str];
var firstChar = caseSensitive ? str[0] : str[0].toLowerCase();
var list = data[firstChar];
if(!list) return (data[str] = []);
return (data[str] = searchFor(str, list, caseSensitive));
}
3.) 使用以下脚本创建一个预缓存对象。我建议您运行一次并使用JSON.stringify创建一个静态缓存对象。(或在后端执行此操作)
var preCache = function(arr){
var chars = "abcdefghijklmnopqrstuvwxyz".split('');
var cache = {};
var i = chars.length;
while(i--){
cache[chars[i]] = searchFor(chars[i], arr, false, true);
}
return cache;
}
可能比您预期的代码多一些,但优化和性能并不是免费的。