首页 » 学习JavaScript数据结构与算法(第2版) » 学习JavaScript数据结构与算法(第2版)全文在线阅读

《学习JavaScript数据结构与算法(第2版)》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 1averageTemp[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 2averageTemp[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语句,以此类推。