Quiero eliminar los elementos de una matriz con n elementos usando un bucle for y el método de empalme uno por uno. El ciclo se ejecuta n - 2 veces y habrá 2 elementos dentro de la matriz al final. ¿Por qué es así?
const fruits = ['Apple', 'Orange', 'Watermelon', 'Peach'] for(index in fruits){ console.log('Execution Number:', index); console.log('Before:', fruits); fruits.splice(0, 1); console.log('After:', fruits); console.log('-'.repeat(50)); } console.log('\nFinal Result:', fruits)resultado:
Execution Number: 0 Before: [ 'Apple', 'Orange', 'Watermelon', 'Peach' ] After: [ 'Orange', 'Watermelon', 'Peach' ] -------------------------------------------------- Execution Number: 1 Before: [ 'Orange', 'Watermelon', 'Peach' ] After: [ 'Watermelon', 'Peach' ] -------------------------------------------------- Final Result: [ 'Watermelon', 'Peach' ]Sé que puedo hacer esto con una sola línea de código usando el método de empalme, pero quería probar si puedo hacerlo usando un bucle for.
Esto sucede porque está reduciendo la longitud de la matriz en cada bucle. Al hacer esto, el número de elementos en la matriz disminuye pero el índice aún aumenta.
| frutas | Índice | |
|---|---|---|
| ['Manzana', 'Naranja', 'Sandía', 'Melocotón'] | 0 | 0 < 4 por lo tanto, Apple se elimina |
| ['Naranja', 'Sandía', 'Melocotón'] | 1 | 1 < 3 por lo que se elimina naranja |
| ['Sandía', 'Melocotón'] | 2 | 2 < 2 Aquí 2 < 2 es falso, el ciclo se detiene |
Una solución sería hacer un ciclo for con una longitud fija calculada antes del ciclo
const fruits = ['Apple', 'Orange', 'Watermelon', 'Peach'] const length = fruits.length for (let index = 0; index < length; index++){ console.log('Execution Number:', index); console.log('Before:', fruits); fruits.splice(0, 1); console.log('After:', fruits); console.log('-'.repeat(50)); } console.log('\nFinal Result:', fruits) Como mencionó @reyno, en los fragmentos anteriores no puede acceder a las frutas individualmente. De hecho, si desea acceder a cada fruta en el bucle de piso, puede hacerlo accediendo al primer elemento de la matriz cada vez: fruits[0]
El problema se está viendo porque la longitud de la matriz se reduce en uno en cada iteración debido a fruits.splice(0,1) .
fruits.length = 4fruits.length = 3fruits.length = 2 -> for loop breaksDe ahí la observación.
Cuando haces fruits.splice , estás modificando la matriz utilizada para el bucle for en sí. Si observa el index , se incrementa en cada ciclo. Después Execution Number: 1 , se incrementa a 2 y mira las fruits y ve que no hay más elementos. Al ver eso, sale del bucle for.
Si quieres hacerlo con un bucle for, lo que probablemente querías era
const fruits = ['Apple', 'Orange', 'Watermelon', 'Peach'] const fruitsLen = fruits.length; for(let i = 0; i < fruitsLen; i++){ console.log('Execution Number:', i); console.log('Before:', fruits); fruits.splice(0, 1); console.log('After:', fruits); console.log('-'.repeat(50)); } console.log('\nFinal Result:', fruits)