Estoy encontrando un comportamiento inesperado en mi código JavaScript que me gustaría entender. Quiero una función de una línea para detectar si existe un número dentro de una matriz de enteros. El número que se verifica es el iterador de un ciclo en otra matriz. Estoy usando la función include( includes() estándar, debería tener en cuenta que sucede lo mismo con un indexOf() >= 0 . Para esta prueba tenemos el siguiente código:
const array1 = [0, 1, 2, 3]; const array2 = [1, 2]; for(let i in array1) console.log(array2.includes(i)); Para mi sorpresa, cada salida devuelve false en lugar de la secuencia false true true false esperada. ¿Cómo puede ser esto? Sé que estoy comprobando i no arr[i] i pero todavía corresponde a los números incluidos en esas matrices: 0 sigue siendo 0, 1 sigue siendo 1, etc. Usar arr.includes(1) devuelve verdadero, así que ¿por qué? no arr.includes(i) cuando i también es 1?
Un for...in recorre todas las claves/propiedades.
Es una cadena, no un número, que proviene de la propiedad de soporte de acceso.
const array1 = [0, 1, 2, 3]; const array2 = [1, 2]; for(let i in array1) console.log(typeof i, i, array2.includes(i)); Un for...of recorre los valores si el objeto es iterable, definido por alguna función que no conozco y que no es importante en este momento.
const array1 = [0, 1, 2, 3]; const array2 = [1, 2]; for(let i of array1) console.log(typeof i, i, array2.includes(i)); También sepa que su bucle for...in no hace lo que parece esperar que haga cuando array1 no es una lista de enteros crecientes que comienza en 0:
const array1 = [6, 4, 3, 95, 45, 3, 3]; for(let i in array1) console.log(typeof i, i); Entonces, lo que debe hacer es usar for...of (o Array.prototype.forEach , o un bucle tradicional for (let i = 0; i < arr.length; i++) , etc.) a menos que necesite un for...in (que casi nunca), o en este caso, supongo que puede convertir la cadena en un número antes de verificar si se llama en Array.prototype.includes
const array1 = [0, 1, 2, 3]; const array2 = [1, 2]; for(let i in array1) console.log(i, array2.includes(parseInt(i)));for...in recorre todas las propiedades, no los valores. Las matrices son objetos y sus propiedades son 0 ... array.length , por lo que i dentro del ciclo for es 1 , 2 , 3 y 4 .
Deberías estar usando un bucle for...of en su lugar:
const array1 = [0, 1, 2, 3]; const array2 = [1, 2]; for(let i of array1) console.log(array2.includes(i));Debe usar for..of con arreglos y for..in con objetos
La instrucción for...of crea un bucle iterando sobre objetos iterables, incluidos: String integrado, Array, objetos similares a matrices (por ejemplo, argumentos o NodeList), TypedArray, Map, Set y iterables definidos por el usuario. Invoca un enlace de iteración personalizado con declaraciones que se ejecutarán para el valor de cada propiedad distinta del objeto. - MDN
const array1 = [0, 1, 2, 3]; const array2 = [1, 2]; for (let i of array1) console.log(array2.includes(i));Opciones alternativas
También puede usar forEach aquí para lograr exactamente el mismo resultado:
const array1 = [0, 1, 2, 3]; const array2 = [1, 2]; array1.forEach((val) => console.log(array2.includes(val)));