La méthode de traversée la plus couramment utilisée concerne les déclarations (également récursives et bien que). Lorsque nous traversons un tableau, nous faisons généralement ceci:
La copie de code est la suivante:
var arr = [1,2,3,4,5,6,7,8,9,10];
pour (var i = 0, total = arr.length; i <total; i ++) {
console.log (i, arr [i]);
}
Il s'agit de la méthode de traversée la plus couramment utilisée: la traversée de l'ordre positif. Il passe du premier élément du tableau au dernier élément.
Alors pourquoi le petit drame mentionne-t-il toujours la traversée de l'ordre inversé aujourd'hui?
Ici, nous devons mentionner le module le plus utilisé dans le composant écrit par Xiaoju: Events. Utilisé pour créer des modèles d'événements personnalisés, gérer l'écoute et le déclenchement des événements, le mode de publication et de souscription le plus simple. Parce que récemment a découvert qu'il y a un danger caché de débordement de mémoire, il est nécessaire d'ajouter une méthode pour dériver sur la base d'origine.
Étant donné que la fonction de rappel avec le même nom d'événement est placée dans le même tableau, la non-liaison nécessite uniquement de trouver la fonction de rappel correspondante du tableau (la même fonction de rappel peut être liée plusieurs fois) et la supprimer.
C'est une exigence très simple, donc j'ai naturellement écrit un code similaire à ce qui suit:
La copie de code est la suivante:
// Retirez 2 dans le tableau
var arr = [1,2,2,2,2,1,1,2,2];
pour (var i = 0, total = arr.length; i <total; i ++) {
if (arr [i] == 2) {
// remplit les conditions, supprimez
Arr.splice (i, 1);
}
}
console.log (arr);
Il n'y a pas de code normal, mais la sortie finale est: [1, 2, 2, 1, 1, 2]. De toute évidence, le résultat d'exécution ne répond pas aux attentes.
Quel est le problème?
Après une analyse minutieuse, j'ai constaté que le problème est que chaque fois que le match réussit, après avoir effectué l'opération de retrait, l'élément suivant à vérifier sera ignoré car chaque élément du tableau augmentera un par un.
J'ai trouvé le problème, modifié le code et après avoir effectué l'opération de suppression, ajustez l'indice de séquence (I).
La copie de code est la suivante:
// Retirez 2 dans le tableau
var arr = [1,2,2,2,2,1,1,2,2];
pour (var i = 0, total = arr.length; i <total; i ++) {
if (arr [i] == 2) {
// remplit les conditions, supprimez
Arr.splice (i, 1);
// ajuste l'indice de séquence
i = i-1;
}
}
console.log (arr);
Le problème a été résolu, mais je pense toujours que la modification de l'indice de séquence est une astuce pour faire une boucle pour une boucle. Donc un éclair d'inspiration, et une gifle, et le code suivant a été frappé:
La copie de code est la suivante:
// Retirez 2 dans le tableau
var arr = [1,2,2,2,2,1,1,2,2];
pour (var i = arr.length-1; i! = - 1; i -) {
if (arr [i] == 2) {
// remplit les conditions, supprimez
Arr.splice (i, 1);
}
}
console.log (arr);
Le processus de traversée reste inchangé. La seule chose qui change, c'est que l'ordre de traversée a changé. Soit dit en passant, il manque également un total variable.
OK, j'avoue que ce que j'ai écrit aujourd'hui est très soyeux, mais grâce à cet exemple, je vous rappelle lors de l'écriture de code à l'avenir. Pendant le processus de traversée, s'il implique de modifier le tableau lui-même (ajoutant et supprimer), la traversée inverse est une méthode de traversée relativement sûre.
Notes de codage, laissez-les se moquer de vous-même à l'avenir!
Veuillez indiquer la source de réimpression: http://bh-lay.com/blog/148c07761fa