2

私は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; 
    } 
} 

答えて

3

あなたは見事まさにこの問題のために構成されているtrieデータ構造、に見てみたいことがあります。トライでは、ある接頭辞で始まるすべての文字列を非常に効率的にリストすることができます。また、単語リスト内のすべての単語を見る必要もありません。高速検索、高速後続検索、先行検索、高速挿入/削除など、他の優れた操作もトライで行うことができます。

希望すると便利です。

+0

これは、私の使用のための良い実装かもしれないようです:http://stackoverflow.com/a/5023187/324085 – thedjpetersen

+0

JavaScriptのTrieの他の一般的な実装があるかどうか知っていますか? – thedjpetersen

+0

@ thedjpetersen-私はJavaScriptのコーダーではないので、標準的な実装についてはわかりません。つまり、良いトライ実装が存在しなければ、私は本当に驚くはずです。 – templatetypedef