Con los métodos de objeto Array puede modificar el contenido de Array comparado con el básico para bucles, estos métodos carecen de una funcionalidad importante. No puede modificar el índice en la ejecución.
Por ejemplo, si elimina el elemento actual y lo coloca en otra posición de índice dentro de la misma matriz, puede hacerlo fácilmente. Si mueve el elemento actual a una posición anterior, no hay problema en la próxima iteración, obtendrá el mismo elemento siguiente como si no hubiera hecho nada.
Considere este código donde movemos el elemento en la posición de índice 5 a la posición de índice 2 una vez que el índice cuenta hasta 5.
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
Sin embargo, si movemos el elemento actual a algún lugar más allá de la posición actual del índice, las cosas se complicarán un poco. Luego, el siguiente elemento cambiará a la posición de elementos movidos y en la próxima iteración no podremos verlo ni evaluarlo.
Considere este código donde movemos el elemento en la posición de índice 5 a la posición de índice 7 una vez que el índice cuenta hasta 5.
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
Entonces nunca hemos cumplido 6 en el ciclo. Normalmente, en un bucle for, se espera que disminuya el valor del índice cuando mueve el elemento de la matriz hacia adelante para que su índice permanezca en la misma posición en la próxima ejecución y aún pueda evaluar el elemento desplazado al lugar del elemento eliminado. Esto no es posible con los métodos de matriz. No puedes alterar el índice. Comprueba el siguiente código
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
Como ve cuando disminuimos i
, no continuará desde 5 sino desde 6, desde donde se dejó.
Así que ten esto en cuenta.