此代码将集成到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的多个实例的任何提示?
答案 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的多个实例”是什么意思?你能举出一个你想到的问题的例子吗?