Die am häufigsten verwendete Traversalmethode ist für Aussagen (auch rekursiv und während). Wenn wir ein Array durchqueren, tun wir dies normalerweise:
Die Codekopie lautet wie folgt:
var arr = [1,2,3,4,5,6,7,8,9,10];
für (var i = 0, Total = arr.Length; i <total; i ++) {
console.log (i, arr [i]);
}
Dies ist die am häufigsten verwendete Traversal -Methode: positive Ordnung Traversal. Es geht vom ersten Artikel im Array zum letzten Artikel.
Warum erwähnt das kleine Drama dann heute noch die Umkehrreihenfolge?
Hier müssen wir das am häufigsten verwendete Modul in der von Xiaoju geschriebenen Komponente: Ereignisse erwähnen. Wird verwendet, um benutzerdefinierte Ereignismodelle zu erstellen, Ereignishörungen und -auslöser, den einfachsten Veröffentlichungs- und Abonnement -Modus. Da kürzlich entdeckt wurde, dass es eine versteckte Gefahr des Speicherüberlaufs besteht, ist es erforderlich, eine Methode zum Entbinden auf der ursprünglichen Basis hinzuzufügen.
Da die Rückruffunktion mit demselben Ereignisnamen im selben Array platziert ist, erfordert das Unentfinden nur die entsprechende Rückruffunktion aus dem Array (dieselbe Rückruffunktion kann mehrmals gebunden sein) und das Entfernen.
Es ist eine sehr einfache Anforderung, daher habe ich natürlich einen Code geschrieben, der dem folgenden ähnelt:
Die Codekopie lautet wie folgt:
// 2 im Array entfernen
var arr = [1,2,2,2,2,1,1,2,2];
für (var i = 0, Total = arr.Length; i <total; i ++) {
if (arr [i] == 2) {
// die Bedingungen erfüllen, entfernen
Arr.SPLICE (i, 1);
}
}
console.log (arr);
Es gibt keinen normalen Code, aber die endgültige Ausgabe lautet: [1, 2, 2, 1, 1, 2]. Offensichtlich entspricht das Ausführungsergebnis nicht die Erwartungen.
Was ist das Problem?
Nach einer sorgfältigen Analyse stellte ich fest, dass das Problem darin besteht, dass jedes Mal, wenn die Übereinstimmung erfolgreich ist, nach der Durchführung des Entfernungsvorgangs das nächste Gegenstand übersprungen wird, da jedes Element im Array nacheinander steigt.
Ich fand das Problem, änderte den Code und passen Sie nach der Durchführung des Entfernungsvorgangs den Sequence Index (I) an.
Die Codekopie lautet wie folgt:
// 2 im Array entfernen
var arr = [1,2,2,2,2,1,1,2,2];
für (var i = 0, Total = arr.Length; i <total; i ++) {
if (arr [i] == 2) {
// die Bedingungen erfüllen, entfernen
Arr.SPLICE (i, 1);
// Passen Sie den Sequenzindex an
i = i-1;
}
}
console.log (arr);
Das Problem wurde gelöst, aber ich habe immer das Gefühl, dass das Ändern des Sequenzindex ein Trick für die Schleife ist. Also wurde ein Blitz der Inspiration und ein Schlag und der folgende Code ausgestattet:
Die Codekopie lautet wie folgt:
// 2 im Array entfernen
var arr = [1,2,2,2,2,1,1,2,2];
für (var i = arr.length-1; i! =-1; i-) {
if (arr [i] == 2) {
// die Bedingungen erfüllen, entfernen
Arr.SPLICE (i, 1);
}
}
console.log (arr);
Der Traversalprozess bleibt unverändert. Das einzige, was sich ändert, ist, dass sich die Reihenfolge des Traverses geändert hat. Übrigens fehlt auch eine variable Gesamtzahl.
Ok, ich gebe zu, dass das, was ich heute geschrieben habe, sehr seidig ist, aber an diesem Beispiel erinnere ich Sie beim Schreiben von Code in der Zukunft. Während des Traversalprozesses beinhaltet das Reverse -Traversal, wenn es das Array selbst modifiziert (Hinzufügen und Löschen), eine relativ sichere Durchlaufmethode.
Kodieren Notizen, lassen Sie sie sich in Zukunft selbst verspotten!
Bitte geben Sie die Quelle für den Nachdruck an: http://bh-lay.com/blog/148c07761fa