2011-03-16 159 views
4

我一直在玩javascript,發現(至少對我來說)在通過foreach循環處理多維數組時遇到的奇怪行爲。所以我有這樣一段代碼:javascript foreach如何處理多維數組?

<script type="text/javascript"> 
    var arr = [['a', 'b'], ['c','d']]; 

    var first=''; 

    for (var singleArray in arr) { 
    first += ' ' + singleArray[0] + ' ' + singleArray[1]; 
    } 

    var second = ''; 
    for (var i=0;i<arr.length; i++) { 
    second += ' ' + arr[i][0] + ' ' + arr[i][1]; 
    } 

    console.log('First: ', first); 
    console.log('Second: ', second); 
</script> 

輸出是:

First: 0 undefined 1 undefined 
Second: a b c d 

我希望第一和第二將是相同的。你能解釋一下我失蹤的事嗎?

注意:請不要通過jQuery或其他方式遍歷數組。我沒有編碼麻煩,我只是對這種特殊情況感到好奇。謝謝!

+1

當它不使用forEach時,它不應該被命名爲forEach。對於例如this:'arr.forEach(function(is){is.forEach(function(his){console.log(his)})});'做的是正確的事情。 – 2013-03-17 10:31:14

+0

@CrisStringfellow我還發現這個問題的標題是誤導性的,因爲我正在尋找有關'forEach'循環的信息。那麼這個問題的標題應該是什麼? – 2013-07-20 22:34:12

回答

7

Erick Mickelsen指出了一些很好的觀點,但總結如此。以上對象屬性

  • array

    1. for (... in ...)循環迭代以JavaScript對象所以你可能的陣列迭代它。但它會慢一些,一般不推薦(見why is that
    2. 它迭代屬性而不是值的事實意味着它返回索引而不是數組值(當你有關聯數組時,這可能會很方便)
    3. 在討論的示例可以與for (... in ...)

    來解決如下:

    var third = ''; 
    for (var arrayIndex in arr) { 
        third += ' ' + arr[arrayIndex][0] + ' ' + arr[arrayIndex][1]; 
    } 
    

    在關聯數組示例的for (... in ...)環路將是方便的:

    var person = []; 
    person["id"] = 1; 
    person["born"] = 2009; 
    person["favourite_meal"] = "chicken"; 
    
    var fourth = ''; 
    for (var arrayIndex in person) { 
        fourth += ' ' + person[arrayIndex]; 
    } 
    
  • 1

    for (... in ...)遍歷對象的屬性,而不是數組的元素。 w3schoolsjavascript garden

    +0

    嗯,但我多次看到它,並驗證我自己(...在...)對單維數組有效。這是偶然的? – 2011-03-16 18:16:33

    +0

    @Jan:它可以用於數組,但它仍然遍歷屬性名稱/索引,而不是值。但要小心,因爲它遍歷** all **屬性,而不僅僅是索引,包括添加到'Array.prototype'的函數。 JavaScript的for/in真的不是爲數組設計的,它恰好可以工作(有點)。 – 2011-03-16 18:22:40

    +0

    剛剛發現它在數組中的作用相當不錯,但是這裏的區別在於它不會返回值,而是會返回索引... – 2011-03-16 18:25:31