Javascript 从字符串数组完成制表符

Javascript 从字符串数组完成制表符,javascript,string,optimization,data-structures,autocomplete,Javascript,String,Optimization,Data Structures,Autocomplete,我正在构建一个IRC客户端,我希望实现一个标签全名的解决方案。我有一个数组形式的用户列表。当用户按tab键时,完成用户名。当他们再次按键时,下一个用户完成 我这里有一个有效的解决方案,但我觉得它可以更优化、更简洁。如有任何建议,我将不胜感激 // Get Active Window var channel = irc.chatWindows.getActive(); // Get users input var sentence = $('#chat-input').val().split('

我正在构建一个IRC客户端,我希望实现一个标签全名的解决方案。我有一个数组形式的用户列表。当用户按tab键时,完成用户名。当他们再次按键时,下一个用户完成

我这里有一个有效的解决方案,但我觉得它可以更优化、更简洁。如有任何建议,我将不胜感激

// Get Active Window
var channel = irc.chatWindows.getActive();
// Get users input
var sentence = $('#chat-input').val().split(' ');
// Get the last word in the sentence
var partialMatch = sentence.pop();
// Get list of users
var users = channel.userList.getUsers();
// Set default index for loop
var userIndex=0;
//Persist the match
//Store the partialMatch to persist next time the user hits tab
if(window.partialMatch === undefined) {
  window.partialMatch = partialMatch;
} else if(partialMatch.search(window.partialMatch) !== 0){
  window.partialMatch = partialMatch;
} else {
  if (sentence.length === 0) {
    userIndex = users.indexOf(partialMatch.substr(0, partialMatch.length-1));
  } else {
    userIndex = users.indexOf(partialMatch);
  }
}
//Cycle through userlist from last user or beginning
for (var i=userIndex; i<users.length; i++) {
  var user = users[i] || '';
  //Search for match
  if (window.partialMatch.length > 0 && user.search(window.partialMatch, "i") === 0) {
    //If no match found we continue searching
    if(user === partialMatch || user === partialMatch.substr(0, partialMatch.length-1)){
      continue;
    }
    //If we find a match we return our match to our input
    sentence.push(user);
    //We decide whether or not to add colon
    if (sentence.length === 1) {
      $('#chat-input').val(sentence.join(' ') +  ":");
    } else {
      $('#chat-input').val(sentence.join(' '));
    }
    //We break from our loop
    break;
  }
}
//获取活动窗口
var channel=irc.chatWindows.getActive();
//获取用户输入
var语句=$(“#聊天输入”).val().split(“”);
//找出句子中的最后一个词
var partialMatch=句子.pop();
//获取用户列表
var users=channel.userList.getUsers();
//为循环设置默认索引
var userIndex=0;
//坚持比赛
//存储partialMatch以在用户下次点击选项卡时保持
if(window.partialMatch==未定义){
window.partialMatch=partialMatch;
}else if(partialMatch.search(window.partialMatch)!==0){
window.partialMatch=partialMatch;
}否则{
如果(句子长度===0){
userIndex=users.indexOf(partialMatch.substr(0,partialMatch.length-1));
}否则{
userIndex=users.indexOf(partialMatch);
}
}
//从最后一个用户或开始循环浏览用户列表
对于(var i=userIndex;i0&&user.search(window.partialMatch,“i”)==0){
//如果没有找到匹配项,我们将继续搜索
if(user===partialMatch | | user===partialMatch.substr(0,partialMatch.length-1)){
继续;
}
//如果我们找到匹配项,我们会将匹配项返回到输入
推送(用户);
//我们决定是否添加冒号
如果(句子长度===1){
$('#chat input').val(句子.join('')+'':'');
}否则{
$('#聊天输入').val(句子连接('');
}
//我们打破了我们的循环
打破
}
}

您可能需要研究数据结构,它的结构非常适合这个问题。使用trie,您可以非常高效地列出以给定前缀开头的所有字符串,而无需查看单词列表中的所有单词。您还可以使用trie执行其他漂亮的操作,例如快速查找、快速后续和前置搜索以及快速插入/删除


希望这有帮助

看起来这对我来说可能是一个很好的实现:你知道javascript中有没有其他常见的Trie实现吗?@thedjpetersen-我不是一个很好的javascript编码器,所以我不知道标准实现。也就是说,如果没有一个好的trie实现,我会非常惊讶。