Mit den Methoden des Array-Objekts können Sie den Inhalt des Arrays ändern, doch im Vergleich zu den grundlegenden for-Schleifen fehlt diesen Methoden eine wichtige Funktion. Sie können den Index während der Ausführung nicht ändern.
Wenn Sie z. B. das aktuelle Element entfernen und an einer anderen Indexposition innerhalb desselben Arrays platzieren möchten, können Sie dies problemlos tun. Wenn Sie das aktuelle Element an eine frühere Position verschieben, ist es kein Problem, dass Sie bei der nächsten Iteration dasselbe nächste Element erhalten, als hätten Sie nichts getan.
Betrachten Sie diesen Code, in dem wir das Element an der Indexposition 5 an die Indexposition 2 verschieben, sobald der Index auf 5 hochgezählt wird.
var ar = [0,1,2,3,4,5,6,7,8,9];
ar.forEach((e,i,a) => {
i == 5 && a.splice(2,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9
Wenn wir jedoch das aktuelle Element an einen Ort jenseits der aktuellen Indexposition verschieben, werden die Dinge ein wenig unübersichtlich. Dann verschiebt sich das nächste Element an die Position des verschobenen Elements, und bei der nächsten Iteration können wir es weder sehen noch auswerten.
Betrachten Sie diesen Code, in dem wir das Element an der Indexposition 5 an die Indexposition 7 verschieben, sobald der Index auf 5 hochzählt.
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && a.splice(7,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 7 - 7 5 - 8 8 - 9 9
Wir haben also nie 6 in der Schleife getroffen. Normalerweise wird in einer for-Schleife erwartet, dass Sie den Indexwert dekrementieren, wenn Sie das Array-Element nach vorne verschieben, damit Ihr Index beim nächsten Durchlauf an der gleichen Position bleibt und Sie das an die Stelle des entfernten Elements verschobene Element immer noch auswerten können. Dies ist bei Array-Methoden nicht möglich. Sie können den Index nicht ändern. Prüfen Sie den folgenden Code
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && (a.splice(7,0,a.splice(i,1)[0]), i--);
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 4 5 - 6 7 - 7 5 - 8 8 - 9 9
Wie Sie sehen, wenn wir dekrementieren i
es wird nicht bei 5, sondern bei 6 fortgesetzt, also dort, wo es verlassen wurde.
Behalten Sie dies also im Hinterkopf.