Realmente no entiendo qué puede estar pasando aquí. Así que tengo una función que toma una matriz 2d y una cadena e itera a través de la matriz 2d y verifica si algún subarreglo contiene la cadena. Pero de alguna manera no puedo iterar sobre este objeto/matriz y estoy realmente confundido en cuanto a lo que realmente es. He hecho muchas iteraciones en javascript. Probé for-in, for-of (es6), C stlye (como a continuación), forEach (devolución de llamada), mapa... nada funciona.
_makeOrUpdateCase = (arrayOfArrays, str) => { console.log(arrayOfArrays); //returns the object/array shown in image below, expected console.log(typeof(arrayOfArrays)); //object console.log(Array.isArray(arrayOfArrays)); //true - huh? is this array or object?? for (var i = 0; i < arrayOfArrays.length; i++) { console.log(arrayOfArrays[i]) //this does not work console.log(i); //nothing is printed out, as if the loop is simply ignored }
Aquí está el resultado que obtengo... puede ver que las cosas que estoy imprimiendo en el bucle no se ejecutan. Sé que javascript puede ser extraño, pero vamos, ¿qué está pasando aquí? No tengo idea de qué buscar en Google. He iterado sobre arreglos y objetos muchas veces en este código.
tl; dr: Su bucle está bien, pero la matriz está vacía incluso si aparece en la consola que no lo está.
Está iniciando sesión/accediendo a la matriz antes de que se llenara. Eso es evidente por el Array[0]
en la salida (que indica un arreglo de longitud 0), aunque parece tener un elemento. Esto puede suceder si tiene un proceso asincrónico, como Ajax, pero está iniciando sesión/accediendo a la matriz antes de que finalice el proceso asincrónico.
Si pasa el cursor sobre la pequeña i
en la consola, le indicará que el valor se acaba de evaluar, es decir, muestra el valor que tiene la variable en el momento en que hace clic en el triángulo, no en el momento en que registra el valor en el código. Para cuando haga clic en el triángulo, es probable que el proceso asíncrono haya terminado.
Sin embargo, si usa console.log(JSON.stringify(arrayOfArrays));
en su lugar, verá que la matriz está vacía.
Aquí hay un ejemplo simple que demuestra el problema (abra la consola del navegador y expanda la matriz, funciona al menos en Chrome):
// Open the browser console var arr = []; console.log(arr); arr.push(1,2,3);
La única solución es llamar a _makeOrUpdateCase
solo después de que finalice el proceso asíncrono. Dado que no está mostrando cómo/cuándo/dónde se llama a la función, esto es todo lo que se puede decir sobre el problema.
Relacionado: ¿La consola de JavaScript de Chrome es perezosa para evaluar matrices?