Завершение табуляции из массива строк - PullRequest
2 голосов
/ 01 февраля 2012

Я создаю IRC-клиент и надеюсь реализовать решение для ввода полных имен.У меня есть список пользователей в виде массива.Когда пользователь нажимает клавишу табуляции, он завершает имя пользователя.Когда они снова нажимают клавишу, она завершается со следующим пользователем.

У меня есть рабочее решение, но я чувствую, что оно может быть немного более оптимизированным и кратким.Буду благодарен за любые предложения.

// 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;
  }
}

1 Ответ

3 голосов
/ 01 февраля 2012

Возможно, вы захотите взглянуть на структуру данных trie , которая отлично структурирована именно для этой проблемы.С помощью trie вы можете перечислить все строки, которые начинаются с заданного префикса, очень эффективно и без необходимости просматривать все слова в списке слов.Вы также можете выполнять другие полезные операции с деревом, такие как быстрый поиск, быстрый поиск преемника и предшественника, а также быстрая вставка / удаление.

Надеюсь, это поможет!

...