有没有办法让这个JavaScript选项卡完成脚本更有效?

时间:2010-05-05 01:28:24

标签: javascript ajax performance chat

此代码将集成到AJAX聊天系统中,以启用用户名的选项卡自动完成功能:

var usernames = new Array();
usernames[0] = "Saladin";
usernames[1] = "Jyllaby";
usernames[2] = "CadaverKindler";
usernames[3] = "qbsuperstar03";

var text = "Text and something else q";

// Start of the script to be imported
var searchTerm = text.slice(text.lastIndexOf(" ") + 1);
var i;
for(i = 0; i < usernames.length && usernames[i].substr(0,searchTerm.length) != searchTerm; i++);
// End of the script to be imported

document.write(usernames[i]);

要做的几点注意事项:用户名数组和文本变量都将通过AJAX从聊天本身加载(遗憾的是,我不知道),最终输出将由AJAX处理同样。

有更有效的方法吗?

此外,有关如何处理searchTerm的多个实例的任何提示?

3 个答案:

答案 0 :(得分:0)

通过保持数组排序并使用二进制搜索来查找匹配,您可以显着提高效率(提供大量用户)。

答案 1 :(得分:0)

现在你编码的方式是:

for(i = 0; i < usernames.length && usernames[i].substr(0,searchTerm.length) != searchTerm; i++);

你正在检查用户名的长度和searchTerm的长度,以及从用户名[i]获取一个substr循环呃,循环。

对于在循环过程中不希望改变的任何这些,您应该在循环开始之前将它们存储在变量中。

从变量中获取值比检查对象属性或方法要快得多。

类似于:

for(i = 0,ii=usernames.length,j=searchTerm.length; i < ii && usernames[i].substr(0,j) != searchTerm; i++);

答案 2 :(得分:0)

微优化:不是获取子串并进行比较(创建大量临时字符串)......

usernames[i].substr(0,searchTerm.length) != searchTerm

...你应该使用indexOf,它不会创建临时字符串......

usernames[i].indexOf(searchTerm) == 0

“找到searchTerm的多个实例”是什么意思?你能举出一个你想到的问题的例子吗?