【问题标题】:Can't pass arrays in multidimensional array to other function using setInterval无法使用 setInterval 将多维数组中的数组传递给其他函数
【发布时间】:2014-03-04 12:21:39
【问题描述】:

我有一个名为“thisIsMyContainerArray”的多维数组,其中包含另外两个数组的内容。
我要做的是检查“thisIsMyContainerArray”数组中的每个项目,并在控制台中分别记录该数组中的每个项目(在本例中为另外两个数组),并且每 5 秒执行一次。

到目前为止,我有以下代码:

var thisIsMyContainerArray = new Array();
var thisIsMyArray1 = new Array('val1', 'val2', 'val3', 'val4');
var thisIsMyArray2 = new Array('valA', 'valB', 'valC', 'valD');
thisIsMyContainerArray.push(thisIsMyArray1, thisIsMyArray2);
for (var i = 0; i < thisIsMyContainerArray.length; i++) {
    var t1 = setInterval(tester,5000);
    function tester() {
        console.log(thisIsMyContainerArray[i]);
    }
}

我总是在控制台中得到以下输出,每 5 秒一次:

["val1", "val2", "val3", "val4"]
["val1", "val2", "val3", "val4"] 

这是我想要的结果,我需要在控制台中看到这个,而不是我之前提到的输出:

["val1", "val2", "val3", "val4"]
["valA", "valB", "valC", "valD"] 

任何帮助都将不胜感激,因为我已经坚持了几个小时了,我只是想不通。 :( 我尝试将它传递给测试器函数,但结果却是“未定义”。

【问题讨论】:

  • 您不能将setInterval() 更改为:setInterval(function(){console.log(thisIsMyContainterArray[i]);}); 吗?这将解决您遇到的错误。
  • 或传递变量“i”。 tester(i);function tester(arrayIndex){console.log(thisIsMyContainerArray[arrayIndex]);}
  • 在回复您的第一条评论时,这会给我一个错误“Uncaught ReferenceError: thisIsMyContainterArray is not defined”。

标签: javascript multidimensional-array


【解决方案1】:

试试这个 - 如果现在没有的话,你应该可以让它工作..

var thisIsMyContainerArray = new Array();
var thisIsMyArray1 = new Array('val1', 'val2', 'val3', 'val4');
var thisIsMyArray2 = new Array('valA', 'valB', 'valC', 'valD');
thisIsMyContainerArray.push(thisIsMyArray1, thisIsMyArray2);

var t1 = setInterval(tester,5000);

function tester()
{
   for (var i = 0; i < thisIsMyContainerArray.length; i++) 
   {         
        console.log(thisIsMyContainerArray[i]);          
   }    
}

【讨论】:

  • 谢谢!如果我删除第二个循环,我会得到所需的输出。 :)
  • 是的,我对 JS 感到困惑,对不起!更正了答案
【解决方案2】:

如果我在干净的环境中测试这段代码,它输出的只是undefined,所以这可能是因为i 变量没有被传递,也没有包含在闭包范围内。基本上,全局命名空间中某处有一个i 变量设置为0,这是使用的变量。

另外,我不确定您是否对 t1 变量进行了更多操作,但它在每个循环中都会被重置,因此您将获得恶意间隔。


如果日志记录是你所追求的,我会这样做:

var thisIsMyContainerArray = new Array();
var thisIsMyArray1 = new Array('val1', 'val2', 'val3', 'val4');
var thisIsMyArray2 = new Array('valA', 'valB', 'valC', 'valD');
thisIsMyContainerArray.push(thisIsMyArray1, thisIsMyArray2);
var t1 = setInterval(tester,5000);
function tester() {
    for (var i = 0; i < thisIsMyContainerArray.length; i++) {
        console.log(thisIsMyContainerArray[i]);
    }
}

如果这只是一个简化的示例,并且您需要带有循环的原始结构并为每个数组设置多个间隔,请尝试以下操作:

var thisIsMyContainerArray = new Array();
var thisIsMyArray1 = new Array('val1', 'val2', 'val3', 'val4');
var thisIsMyArray2 = new Array('valA', 'valB', 'valC', 'valD');
thisIsMyContainerArray.push(thisIsMyArray1, thisIsMyArray2);
function tester(index) {
    console.log(thisIsMyContainerArray[index]);
    setTimeout(function() {
        tester(index);
    }, 5000);
}
for (var i = 0; i < thisIsMyContainerArray.length; i++) {
    tester(i);
}

【讨论】:

  • 如何传递它并将其包含在闭包范围内?
  • @Magali 就我个人而言,我会将'tester'函数移到循环之外,在函数末尾给它一个索引参数和一个setTimeout,然后从内部调用函数环形。如果您的用例仅是此日志记录,则可以在“测试器”函数中移动 for 循环。我会在你的全局命名空间中寻找 i 变量。
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
相关资源
最近更新 更多