我真的不明白这里会发生什么。因此,我有一个函数,它接受一个2d数组和一个字符串,并遍历2d数组,并检查是否有任何子数组包含该字符串。但是不知怎么的,我不能迭代这个对象/数组,我真的很困惑它到底是什么。我在javascript中做了很多迭代。我尝试过-in,for-of (es6),C stlye(如下图),forEach(回调),map.毫无办法。
_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可能会很奇怪,但是拜托,这里到底发生了什么,我不知道google会怎么做。在这段代码中,我对数组和对象进行了多次迭代。

发布于 2017-01-05 18:31:32
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?
https://stackoverflow.com/questions/41492035
复制相似问题