JavaScript 没有单独的「二维数组类型」。所谓二维数组,就是元素仍是数组 的数组。访问写成 a[行][列],先取外层下标得到一行,再取内层下标得到单元格。
下面按定义、初始化、遍历、对角线求和、打印下三角五步把常用操作走一遍。下标都从 0 开始。
一、定义:数组的数组
长度为 4 的外层数组,每个元素又是长度 4 的内层数组。右侧注释标出了每个格子的下标:
var arr = [[1,2,4,6],[2,4,7,8],[8,9,10,11],[9,12,13,15]] //arr数组长度为4,每个元素是一个长度为4的数组
var a = [
[1,2,4,6], // a[0][0] a[0][1] a[0][2] a[0][3]
[2,4,7,8], // a[1][0] a[1][1] a[1][2] a[1][3]
[8,9,10,11], // a[2][0] a[2][1] a[2][2] a[2][3]
[9,12,13,15] // a[3][0] a[3][1] a[3][2] a[3][3]
]
| 写法 |
含义 |
例子 |
a[0] |
第 0 行(仍是数组) |
[1,2,4,6] |
a[0][2] |
第 0 行第 2 列 |
4 |
a.length |
行数 |
4 |
a[i].length |
第 i 行的列数 |
本例每行都是 4 |
二、初始化
先 new Array(10) 得到 10 个空位,再给每一行 new Array(8),填入 i + j。结果是 10 行 8 列,第 i 行第 j 列等于 i+j:
/*
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 10
4 5 6 7 8 9 10 11
5 6 7 8 9 10 11 12
6 7 8 9 10 11 12 13
7 8 9 10 11 12 13 14
8 9 10 11 12 13 14 15
9 10 11 12 13 14 15 16
*/
function initTwoArray() {
var arr = new Array(10); // 创建长度为10的数组arr
for (var i = 0; i < arr.length; i++) {
arr[i] = new Array(8); // 给数组arr每个元素赋值长度为8的数组, 这时arr成为二维数组
for (var j = 0; j < 8; j++) {
arr[i][j] = i + j;
}
}
}
三、双重循环遍历
外层走行,内层走该行的列。用 arr[i].length 而不是写死列数,行列不齐时也不会越界:
function printArray(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr[i].length; j++) {
document.write(arr[i][j] + ' ')
}
document.write('<br/>')
}
}
四、主对角线求和
主对角线满足 i == j。方阵时就是 a[0][0] + a[1][1] + …:
function diagonalSum(arr) {
var sum = 0
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr[i].length; j++) {
if (i == j) {
sum = sum + arr[i][j]
}
}
}
document.write('sum = ' + sum)
}
五、打印下三角
下三角保留 i >= j 的格子(含对角线),其余跳过。对开头那个 4×4 示例,打印出来就是:
/*
1
2 4
8 9 10
9 12 13 15
*/
function printTriangle(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr[i].length; j++) {
if (i >= j) {
document.write(arr[i][j] + ' ')
}
}
document.write('<br/>')
}
}
一句话总结:二维数组就是嵌套数组:用双重下标取值,用双重循环初始化、遍历,再用 i 与 j 的关系筛对角线或三角区域。