代码之家  ›  专栏  ›  技术社区  ›  Saladin Akara

有什么方法可以使这个javascript标签完成脚本更高效吗?

  •  1
  • Saladin Akara  · 技术社区  · 15 年前

    此代码将集成到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处理。

    有更有效的方法吗?

    还有,关于如何处理正在查找的搜索词的多个实例的提示吗?

    3 回复  |  直到 15 年前
        1
  •  0
  •   Chris Schmich    15 年前

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

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

    …您应该使用indexof,它不创建临时字符串…

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

    您所说的“正在查找的搜索词的多个实例”是什么意思?你能举个例子来说明你正在考虑的问题吗?

        2
  •  0
  •   Fyodor Soikin    15 年前

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

        3
  •  0
  •   MisterMister    15 年前

    您现在对它进行编码的方式是:

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

    您正在检查用户名的长度和搜索词的长度,并在每次循环时从用户名[i]中获取子字符串。

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

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

    比如:

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