2010-05-05 17 views
1

Ce code doit être intégré dans un système de chat AJAX pour permettre l'achèvement de l'auto-onglet des noms d'utilisateur:Y a-t-il un moyen de rendre ce script d'achèvement de tabulation JavaScript plus efficace?

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]); 

Quelques notes à effectuer: Le tableau de noms d'utilisateur et la variable texte seraient tous les deux chargé à partir du chat lui-même via AJAX (que, malheureusement, je ne sais pas), et la sortie finale sera également traitée par AJAX.

Existe-t-il un moyen plus efficace de le faire?

En outre, des conseils sur la façon de gérer plusieurs instances de searchTerm sont-ils trouvés?

Répondre

0

Micro-optimisation: au lieu d'obtenir la sous-chaîne et de la comparer (créer beaucoup de chaînes temporaires) ...

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

... vous devriez utiliser indexOf, ce qui ne crée pas des chaînes temporaires ...

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

que voulez-vous dire par « plusieurs instances du searchTerm étant trouvé "? Pouvez-vous donner un exemple du problème auquel vous pensez?

+0

Si searchTerm est, par exemple, 'var' et il y a deux noms d'utilisateurs commençant par 'var' - Varsity et Variety, disons ... Dans la situation de chat, vous pouvez vouloir le second résultat, mais pour le moment il ne choisit que le premier qu'il trouve. –

+0

Utilisez un tableau JavaScript et ajoutez chaque utilisateur correspondant. Si l'utilisateur veut voir tous les résultats correspondants, vous les avez tous déjà. Si vous voulez juste montrer le premier ou le dernier résultat, vous pouvez l'obtenir à partir du tableau grâce à l'indexation. Voir http://www.hunlock.com/blogs/Mastering_Javascript_Arrays pour plus de détails. –

0

Vous pouvez rendre ceci nettement plus efficace (en fournissant un grand nombre d'utilisateurs) en gardant le tableau trié et en utilisant la recherche binaire pour trouver la correspondance.

0

La façon dont vous l'avez codé maintenant:

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

Vous regardez la longueur des noms d'utilisateur et la longueur de searchTerm ainsi que d'obtenir un substr de noms d'utilisateur [i] chaque fois que la boucle uh, boucles.

Pour tous ceux que vous ne prévoyez pas de modifier au cours de la boucle, vous devez les stocker dans une variable avant le début de la boucle.

L'extraction d'une valeur d'une variable est beaucoup plus rapide que la vérification d'une propriété ou d'une méthode d'objet.

donc quelque chose comme:

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