2016-03-03 95 views
-1

我有一個問題在我的Google Maps API項目中循環多個數組。數組For循環導致無限循環

我在marker數組中有一個類別數組,我希望能夠根據用戶在下拉菜單中選擇的內容對它們進行排序。

,當他們選擇一個值,下面的函數運行:

filterMarkers = function (category) { 
    for (i = 0; i < markers1.length; i++) { 
     marker = gmarkers1[i]; 
     console.log(marker.category); 
     for(i = 0; i < marker.category.length; i++) { 
      // If is same category or category not picked 
      if (marker.category[i] == category || category.length === 0) { 
       marker.setVisible(true); 
      } 
      // Categories don't match 
      else { 
       marker.setVisible(false); 
      } 
     } 
    } 
} 

但不是每個項目比較數組來選擇裏面有什麼,它只是不斷循環。

JS小提琴: http://jsfiddle.net/japaneselanguagefriend/t3xaj1j5/1/

回答

3

您使用的是兩種不同的迴路相同的全局計數器(i)。

JS對var聲明使用函數級範圍,但允許您使用變量而不會因爲遺留原因而聲明它。你的兩個循環都使用i而不聲明它,所以你正在使用一個全局變量。

在ES5,您可以修復由兩個循環聲明計數器和改變一個用另一個變量,如:

for (var i = 0; i < foo; ++i) { 
    for (var j = 0; j < bar; ++j) { 
    ... 
    } 
} 

最新的語言版本增加了塊作用域的變量,但因爲你的循環是嵌套的,你還需要不同的名稱:

for (let i = 0; i < foo; ++i) { 
    for (let j = 0; j < bar; ++j) { 
    ... 
    } 
} 

無論哪種方式,一定要聲明變量(與varlet,這取決於可用的語言水平),所以他們不會泄漏到了全球範圍。您的腳本頭部應該有一個"use strict";,這將全面防止全局/未聲明的變量。