2011-09-15 45 views
1

我有一個嵌套在另一個使用字符串作爲鍵的數組內的索引數組。我需要從兩個數組中提取信息,並使用以下循環。如何將循環嵌套在關聯數組(JS)內的索引數組中循環

// 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); 
        } 
       });  
      } 
     } 
    } 

此代碼適用於第一個數組的第一個元素。它循環遍歷其內部數組,併爲每個url執行ajax調用而沒有任何問題。但是,當它完成第一個數組的第一個元素時,它不會繼續到第二個元素並獲取它的內部數組數據。

我希望這個解釋不會太糟糕。

你可以在這裏看到完整的代碼更加清晰:http://jsfiddle.net/FvP5f/

回答

2

假設你的數據結構與性能的數組對象,你會做這樣的。

  1. serviceCategories必須是一個對象,而不是一個數組。 Javascript沒有關聯數組。它具有通過密鑰進行存儲和按鍵進行迭代的對象。數組索引是數字。
  2. 你必須實際遍歷每個嵌入數組的長度。
  3. 您不能在成功處理函數中引用key變量,因爲它在循環後被調用很長時間,所以它的值已更改。爲了解決這個問題,我們把鍵放在一個上下文對象中,該對象將被設置爲成功處理程序的「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); 
       } 
      } 
     });  
    } 
} 
+0

工作非常感謝!還有一個問題。結果按隨機順序寫入每個頁面刷新:即,未觀察到陣列中URL的順序。這可能是由這個代碼造成的,還是來自解析結果的代碼的可能性更大(http://jsfiddle.net/cNY5x/)。感謝一個掙扎的菜鳥...... – Fernando

+0

ajax結果是異步收到的,可能不會以任何特定的順序返回。如果您按照某種順序需要它們,那麼您可能必須將結果累積到一系列結果中,然後在收到全部結果後對其進行分類,然後按照所需順序對其進行處理。 – jfriend00

+0

真棒再次感謝!也意識到我可以在我正在使用的jquery ajax方法中將異步選項設置爲false ... – Fernando

1

那麼,一個問題似乎是,你是假設你的數組的第二維度始終是相同的尺寸(即keyCnt)。你似乎也在計算錯誤的方向,我的意思是你將得到兩個(inGoodHands和spaRituals),而你用它作爲inGoodHands的第二個索引,而3用於spaRituals))。

好像你應該做這樣的事情:

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

的Javascript範圍的功能,而不是塊。雖然您可以將var curcat放在for循環中,但重要的是要明白,您沒有爲每次迭代創建不同的變量。

這意味着您在循環中創建的所有閉包實際上都基於相同的變量,因此您可能觀察到的不僅僅是第一個工作,但所有這些閉包都是在工作最後一個鍵。

在javascript中創建本地作用域的解決方案是使用本地函數;而不是

(function(data){ parsePageCount(data, curcat); }) 

你可以使用

(function(x){return function(data){ parsePageCount(data, x); };})(curcat) 

其中名稱x已經被用來代替curcat做出明確的區分。

對於每個創建的閉包,此變量確實是分開的。