Tengo una matriz como esta.
const cntry = ['Albania', 'Bolivia', 'Canada', 'Denmark', 'Ethiopia', 'Finland', 'Germany', 'Hungary', 'Turkey', 'Iceland', 'Ireland'];Quiero eliminar los elementos que contienen la palabra "land" de esta matriz, pero como estoy estudiando "for loop", quiero eliminarlos usando solo el método "for".
Probé este código pero no funcionó. "Irlanda" todavía está en la matriz. ¿Qué hice mal?
for (let i = 0; i < cntry.length; i++) { if (cntry[i].includes('land')) { cntry.splice(i, 1); } }Producción:
(9) ['Albania', 'Bolivia', 'Canada', 'Denmark', 'Ethiopia', 'Germany', 'Hungary', 'Turkey', 'Ireland']Estás mutando cntry for medida que lo haces. Esto rompe la relación de incremento/índice de todos los elementos restantes tan pronto como elimina un elemento de la matriz. Entonces, en su lugar, invierta el ciclo: comience desde el final de la matriz y trabaje hacia el comienzo:
const cntry = ['Albania', 'Bolivia', 'Canada', 'Denmark', 'Ethiopia', 'Finland', 'Germany', 'Hungary', 'Turkey', 'Iceland', 'Ireland']; // start with the length of array minus 1 // decrement i by 1 after each loop // leave loop when i is less than 0 for (let i = cntry.length - 1; i >= 0; i--) { if (cntry[i].includes('land')) { cntry.splice(i, 1); } } console.log(cntry);Ahora, cuando elimina un elemento, los índices anteriores aún corresponden a su valor de incremento actual.
Desarrollando: for (let i = cntry.length - 1; i >= 0; i--)
En su ciclo for, establezca la variable de incremento i en la longitud de la matriz menos 1. Dado que las matrices están indexadas en cero, lo que significa que el primer elemento está indexado en 0 , deberá comenzar su incremento en la longitud de la matriz menos 1. Allí hay 11 elementos en su matriz, por lo que el último elemento está indexado 10 .
let i = cntry.length - 1; Luego permita el ciclo mientras i sea mayor o igual a >= 0. En otras palabras, deje el ciclo cuando i sea menor que cero:
i >= 0; Y finalmente, decrement i . El cambio de incremento de bucle ocurre después de que se haya evaluado el bloque de bucle y antes de la siguiente iteración.
i-- En el "mundo real", usaría una construcción de bucle que se adapta bien al bloque de código que desea evaluar. Dado que está mutando la matriz, sería más adecuado forEach loop ya que no depende de mantener una relación de incremento/índice. Tal vez ese sea el propósito de su tarea, mostrarle cuándo un ciclo for no es apropiado.
Puedes filter tu lista porque cuando usas slice estás sobrescribiendo la matriz original:
const countryList = ['Albania', 'Bolivia', 'Canada', 'Denmark', 'Ethiopia', 'Finland', 'Germany', 'Hungary', 'Turkey', 'Iceland', 'Ireland'] const filter = 'land' const filteredList = [] for (const country of countryList) { if (!country.includes(filter)) { filteredList.push(country) } }Ya existe una mejor respuesta que utiliza la matriz existente, pero aquí hay una solución alternativa.
const cntry = ['Albania', 'Bolivia', 'Canada', 'Denmark', 'Ethiopia', 'Finland', 'Germany', 'Hungary', 'Turkey', 'Iceland', 'Ireland']; const newArray = []; // new target array for countries that don't have 'land' in the name // looping through the cntry array for (let i = 0; i < cntry.length; i++) { // checking to see if the current country in the loop iteration doesn't include 'land' - if false then push that country to the array => newArray if (!cntry[i].includes('land')) { newArray.push(cntry[i]); } } console.log(newArray);