讀古今文學網 > 學習JavaScript數據結構與算法(第2版) > 2.6 二維和多維數組 >

2.6 二維和多維數組

還記得本章開頭平均氣溫測量的例子嗎?現在我打算再用一下,不過把記錄的數據改成數天內每小時的氣溫。現在我們已經知道可以用數組來保存這些數據,那麼要保存兩天的每小時氣溫數據就可以這樣:

var averageTempDay1 = [72,75,79,79,81,81];
var averageTempDay2 = [81,79,75,75,73,72];

  

然而,這不是最好的方法。我們可以做得更好。我們可以使用矩陣(二維數組)來存儲這些信息。矩陣的行保存每天的數據,列對應小時級別的數據:

var averageTemp = ;
averageTemp[0] = [72,75,79,79,81,81];
averageTemp[1] = [81,79,75,75,73,72];

  

JavaScript只支持一維數組,並不支持矩陣。但是,我們可以像上面的代碼一樣,用數組套數組,實現矩陣或任一多維數組。代碼也可以寫成這樣:

//day 1
averageTemp[0] = ;
averageTemp[0][0] = 72;
averageTemp[0][1] = 75;
averageTemp[0][2] = 79;
averageTemp[0][3] = 79;
averageTemp[0][4] = 81;
averageTemp[0][5] = 81;
//day 2
averageTemp[1] = ;
averageTemp[1][0] = 81;
averageTemp[1][1] = 79;
averageTemp[1][2] = 75;
averageTemp[1][3] = 75;
averageTemp[1][4] = 73;
averageTemp[1][5] = 72;

  

上面的代碼裡,我們分別指定了每天和每小時的數據。數組中的內容如下圖所示:

每行就是每天的數據,每列是當天不同時段的氣溫。

2.6.1 迭代二維數組的元素

如果想看這個矩陣的輸出,我們可以創建一個通用函數,專門輸出其中的值:

function printMatrix(myMatrix) {
  for (var i=0; i<myMatrix.length; i++){
    for (var j=0; j<myMatrix[i].length; j++){
      console.log(myMatrix[i][j]);
    }
  }
}

  

需要遍歷所有的行和列。因此,我們需要使用一個嵌套的for循環來處理,其中變量i為行,變量j為列。

使用以下代碼查看矩陣averageTemp的輸出:

printMatrix(averageTemp);

  

2.6.2 多維數組

我們也可以用這種方式來處理多維數組。假如我們要創建一個3×3×3的矩陣,每一格裡包含矩陣的i(行)、j(列)及z(深度)之和:

var matrix3x3x3 = ;
for (var i=0; i<3; i++){
  matrix3x3x3[i] = ;
  for (var j=0; j<3; j++){
    matrix3x3x3[i][j] = ;
    for (var z=0; z<3; z++){
      matrix3x3x3[i][j][z] = i+j+z;
    }
  }
}

  

數據結構中有幾個維度都沒關係,我們都可以用循環遍歷每個維度來訪問所有格子。3×3×3的矩陣也可用立體圖表示如下:

可以用以下代碼輸出這個矩陣的內容:

for (var i=0; i<matrix3x3x3.length; i++){
  for (var j=0; j<matrix3x3x3[i].length; j++){
    for (var z=0; z<matrix3x3x3[i][j].length; z++){
      console.log(matrix3x3x3[i][j][z]);
    }
  }
}

  

如果是一個3×3×3×3的矩陣,代碼中就會用四層嵌套的for語句,以此類推。