Javascript 如何嵌套循环以在关联数组(JS)内的索引数组中循环

Javascript 如何嵌套循环以在关联数组(JS)内的索引数组中循环,javascript,Javascript,我有一个URL索引数组嵌套在另一个数组中,该数组使用字符串作为键。我需要从两个数组中提取信息,并使用以下循环 // Loop through the elements in the associative level to get a count of its items var keyCnt = 0; for(key in serviceCategories) { keyCnt++; } // Then loop through i

我有一个URL索引数组嵌套在另一个数组中,该数组使用字符串作为键。我需要从两个数组中提取信息,并使用以下循环

    // Loop through the elements in the associative level to get a count of its items   
    var keyCnt = 0;
    for(key in serviceCategories) {
        keyCnt++;
    }
    // Then loop through it again, this time nesting another for loop to get at the inner/indexed arrays
    for(key in serviceCategories) {
        var currCat = key;
            for (var i = 0; i < keyCnt; i++) {
                $.ajax({
                    url: serviceCategories[currCat][i],
                    success: function(data) {
                        parsePageCont (data, currCat);
                    }
                });    
            }
        }
    }
//循环关联级别中的元素以获取其项的计数
var-keyCnt=0;
用于(输入serviceCategories){
keyCnt++;
}
//然后再次遍历它,这次嵌套另一个for循环以获取内部/索引数组
用于(输入serviceCategories){
var currCat=键;
对于(变量i=0;i
此代码对于第一个数组的第一个元素正常工作。它循环遍历其内部数组,并对每个url执行ajax调用,没有问题。但是,当它处理完第一个数组的第一个元素后,它不会继续处理第二个元素并获取它的内部数组数据

我希望这个解释没有太混乱


为了更加清晰,您可以在这里看到完整的代码:

假设您的数据结构是一个带有属性数组的对象,您可以这样做

  • serviceCategories
    必须是对象,而不是数组。Javascript没有关联数组。它具有按键存储和按键迭代的对象。数组索引是数字的
  • 您必须实际迭代每个嵌入数组的长度
  • 您不能在成功处理程序中引用
    变量,因为该变量在循环后很长时间内被调用,因此其值已更改。为了解决这个问题,我们将键放在一个上下文对象中,该对象将被设置为成功处理程序的“this”指针,这样我们就可以返回到键 以下是解决这些问题的代码:

    // assume data is of this structure (where I've shown numbers here, they are actually URLs)
    serviceCategories = {
       houses: [1,2,3,4],
       cottages: [5,6,7,8],
       hotels: [8,9,0,1],
       apartments: [2,2,3,4,5,7,8,9]
    };
    
    for (key in serviceCategories) {
        if (serviceCategories.hasOwnProperty(key)) {
            var array = serviceCategories[key];
            // got the next array, iterate through it
            for (var i = 0; i < array.length; i++) {
                var context = {};
                $.ajax({
                    url: array[i],
                    context: {key: key},   // can't refer to key in success handler, so we sest it as context
                    success: function(data) {
                        parsePageCont(data, this.key);
                    }
                }
            });    
        }
    }
    
    //假设数据是这种结构(我在这里显示的数字实际上是URL)
    服务类别={
    房屋:[1,2,3,4],
    村舍:[5,6,7,8],
    酒店:[8,9,0,1],
    公寓:[2,2,3,4,5,7,8,9]
    };
    用于(输入serviceCategories){
    if(serviceCategories.hasOwnProperty(键)){
    var数组=serviceCategories[键];
    //得到下一个数组,遍历它
    对于(var i=0;i
    假设您的数据结构是一个带有属性数组的对象,您可以这样做

  • serviceCategories
    必须是对象,而不是数组。Javascript没有关联数组。它具有按键存储和按键迭代的对象。数组索引是数字的
  • 您必须实际迭代每个嵌入数组的长度
  • 您不能在成功处理程序中引用
    变量,因为该变量在循环后很长时间内被调用,因此其值已更改。为了解决这个问题,我们将键放在一个上下文对象中,该对象将被设置为成功处理程序的“this”指针,这样我们就可以返回到键 以下是解决这些问题的代码:

    // assume data is of this structure (where I've shown numbers here, they are actually URLs)
    serviceCategories = {
       houses: [1,2,3,4],
       cottages: [5,6,7,8],
       hotels: [8,9,0,1],
       apartments: [2,2,3,4,5,7,8,9]
    };
    
    for (key in serviceCategories) {
        if (serviceCategories.hasOwnProperty(key)) {
            var array = serviceCategories[key];
            // got the next array, iterate through it
            for (var i = 0; i < array.length; i++) {
                var context = {};
                $.ajax({
                    url: array[i],
                    context: {key: key},   // can't refer to key in success handler, so we sest it as context
                    success: function(data) {
                        parsePageCont(data, this.key);
                    }
                }
            });    
        }
    }
    
    //假设数据是这种结构(我在这里显示的数字实际上是URL)
    服务类别={
    房屋:[1,2,3,4],
    村舍:[5,6,7,8],
    酒店:[8,9,0,1],
    公寓:[2,2,3,4,5,7,8,9]
    };
    用于(输入serviceCategories){
    if(serviceCategories.hasOwnProperty(键)){
    var数组=serviceCategories[键];
    //得到下一个数组,遍历它
    对于(var i=0;i
    嗯,一个问题似乎是假设数组的第二维度总是相同的大小(即keyCnt)。你似乎也在计算错误的方向,我的意思是你会得到两个(inGoodHands和spaRituals),而你用它来计算第二个索引,inGoodHands是2,spaRituals是3)

    看起来你应该这样做:

    for(x in serviceCategories) {
        for(y in serviceCategories[x]) {
           call ajax for serviceCategories[x][y]
        }
     }
    

    一个问题似乎是假设数组的第二维度总是相同的大小(即keyCnt)。你似乎也在计算错误的方向,我的意思是你会得到两个(inGoodHands和spaRituals),而你用它来计算第二个索引,inGoodHands是2,spaRituals是3)

    看起来你应该这样做:

    for(x in serviceCategories) {
        for(y in serviceCategories[x]) {
           call ajax for serviceCategories[x][y]
        }
     }
    

    Javascript作用域是函数,而不是块。虽然您可以将
    var curcat
    放入for循环中,但重要的是要了解您没有为每个迭代创建不同的变量

    这意味着您在循环中创建的所有闭包实际上都基于同一个变量,因此您可能观察到的不是第一个闭包有效,而是所有闭包都在最后一个关键点有效

    在javascript中创建局部作用域的解决方案是使用局部函数;而不是

    (function(data){ parsePageCount(data, curcat); })
    
    你可以用

    (function(x){return function(data){ parsePageCount(data, x); };})(curcat)
    
    其中已使用名称
    x
    而不是
    curcat
    来明确区别

    对于每个创建的闭包,该变量实际上是独立的。

    <