2013-04-06 98 views
1

我一直試圖在JavaScript中遍歷多維數組,並打印數組中的每個元素。有沒有辦法打印多維數組中的每個元素而不使用嵌套的for-loops?迭代JavaScript數組而不使用嵌套for循環

http://jsfiddle.net/mKsDW/

var arr = [[1, 5],[7, 4]]; 
for(var i in arr){ 
    alert(i); //this displays "0", then displays "1", 
    //instead of printing each element in the array 
    //how can I make it print each element in each 2D array instead, 
    //without using nested for-loops for each dimension of the array? 
} 
+0

對於數組,您應該使用常規for循環而不是'for ... in'。是的,有可能沒有嵌套循環,但有什麼意義?嵌套循環是最具可讀性的解決方案。其他解決方案只會抽象一個級別的迭代。 – 2013-04-06 18:21:42

+0

@FabrícioMatté爲10 x 10 x 10 x 10 x 10陣列編寫嵌套for循環將非常繁瑣,因此我需要更簡潔的解決方案。 – 2013-04-06 18:23:00

+0

哦,我明白了。以爲它只是關於二維數組。 – 2013-04-06 18:23:22

回答

11

聽起來就像是問題是,你可以有任意深度的嵌套。在這種情況下,使用遞歸函數。

function printArray(arr) { 
    for (var i = 0; i < arr.length; i++) 
     if (Array.isArray(arr[i])) 
      printArray(arr[i]) 
     else 
      console.log(arr[i]) 
} 

Array.isArray將需要爲舊版瀏覽器墊片。

if (!Array.isArray) 
    Array.isArray = function(o) { 
     return !!o && Object.prototype.toString.call(o) === "[object Array]" 
    } 
+0

不錯的墊片,我不知道truthy值檢查('!! o')是否只是一個理智檢查/優化或者它實際上是否有必要? – 2013-04-06 18:30:12

+0

@FabrícioMatté:是的,這不是真的需要。 'toString'部分通常是最慢的,所以如果我真的想避免它,我會''o && typeof o ===「object」&& ...' – 2013-04-06 18:32:05

+0

我總是使用[MDN]( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray)墊片,但這個看起來不錯(因爲它基本上是一樣的) – adeneo 2013-04-06 18:33:13

6

如果你不想使用嵌套循環,你可以扁平陣列或使用遞歸函數。例如:

arr.forEach(function each(item) { 
    if (Array.isArray(item)) 
    item.forEach(each); 
    else 
    console.log(item) 
});