2017-01-05 3 views
0

Я действительно не понимаю, что здесь происходит. Поэтому у меня есть функция, которая принимает 2d-массив и строку и выполняет итерацию через массив 2d и проверяет, содержат ли какие-либо подмассивы строку. Но почему-то я не могу перебирать этот объект/массив, и я действительно смущен относительно того, что это на самом деле. Я сделал много итераций в javascript. Я пробовал использовать для in-for (es6), C stlye (например, ниже), forEach (callback), map ... ничего не работает.Невозможно перебрать мой массив/объект. Javascript, React Native

_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 
    } 

Вот результат, который я получаю. Вы можете видеть, что материал, который я печатаю в цикле, не выполняется. Я знаю, что javascript может быть странным, но c'mon, что здесь происходит, я понятия не имею, что делать в Google. Я многократно повторял массивы и объекты в этом коде. enter image description here

+0

выглядит как 'arrayOfArrays' имеет вид' [[ "-K_j43GqrmowwLJPPlm2", "#CDD"]] ' – kukkuz

+0

*" истинно - да это массив или объект? ? "* Массивы - это объекты. –

+0

Google говорит, что «массив JavaScript является« объектом », но это не экземпляр« Object ».» –

ответ

4

tl; dr: Ваша петля прекрасна, но массив пуст, даже если он отображается в консоли, а это не так.

Вы регистрируетесь/получаете доступ к массиву до, он был заселен. Это видно из Array[0] на выходе (с указанием массива длины 0), хотя он появляется, чтобы иметь элемент. Это может произойти, если у вас есть асинхронный процесс, например Ajax, но регистрируются/получаются доступ к массиву до того, как будет выполнен асинхронный процесс.

При наведении курсора на маленькую i в консоли, он скажет вам, что значение было просто оценивали, т.е. он показывает значение переменной имеет в момент нажатия кнопки треугольник, а не на момент входа значение в коде. Когда вы нажмете треугольник, асинхронный процесс, скорее всего, закончится.

Однако, если вы используете console.log(JSON.stringify(arrayOfArrays));, вместо этого вы увидите, что массив пуст.

Вот простой пример, который демонстрирует вопрос (открыть консоль браузера и расширить массив, работает в Chrome, по крайней мере):

// Open the browser console 
 
var arr = []; 
 
console.log(arr); 
 
arr.push(1,2,3);

Единственным решением является вызов _makeOrUpdateCase только после асинхронный процесс. Поскольку вы не показываете, как/когда /, где вызывается функция, это все, что можно сказать о проблеме.


Связанные: Is Chrome's JavaScript console lazy about evaluating arrays?

+0

Вот и все! Я переместил вызов '_makeOrUpdateCase' в обратный вызов' .done' принимает мой вызов firebase. Спасибо, что нашли время, чтобы объяснить. Приятно знать эти маленькие признаки того, что некоторые асинхронные вещи, как Array [0], записываются на консоль. Я буду помнить об этом и в будущем. Если у вас есть идеи переименования названия этого вопроса, чтобы помочь другим, у кого может быть такая ситуация в будущем, дайте мне знать. –