Javascript 零基础教程

JavaScript 多维数组

多维数组扩展了数组的概念,允许你在数组内部创建数组。这使你能够以类似网格的结构(如表格或矩阵)来存储和操作数据。

多维数组可以组织具有多个维度或类别的数据,它能更轻松地表示复杂关系并执行高级数据处理。

1. 理解多维数组

多维数组本质上是数组的数组。这意味着主数组中的每个元素本身也可以是另一个数组。这些内部数组又可以包含更多数组,从而创建任意深度的数组。

虽然你可以创建超过两个维度的数组,但二维数组是最常见且最容易可视化的。

2. 创建多维数组

在 JavaScript 中,你通过将数组嵌套在彼此内部来创建多维数组。下面是如何创建一个基本的二维数组:

// 创建一个代表矩阵的二维数组
let matrix = [
  [1, 2, 3], // 第 1 行
  [4, 5, 6], // 第 2 行
  [7, 8, 9]  // 第 3 行
];

console.log(matrix);

在这个例子中,matrix 是一个包含三个元素的数组。这三个元素中的每一个本身又是一个包含三个数字的数组。你可以把它想象成一个 3 行 3 列的表格。

3. 访问多维数组中的元素

要访问多维数组中的元素,你需要使用多个索引。第一个索引指定,第二个索引指定。请记住,JavaScript 数组是零基索引(zero-indexed)的,这意味着第一个元素的索引是 0。

// 访问矩阵中的元素
console.log(matrix[0][0]); // 输出: 1 (第 0 行,第 0 列的元素)
console.log(matrix[1][2]); // 输出: 6 (第 1 行,第 2 列的元素)
console.log(matrix[2][1]); // 输出: 8 (第 2 行,第 1 列的元素)

4. 修改多维数组中的元素

你也可以通过向特定索引赋值来修改多维数组中的元素:

// 修改矩阵中的一个元素
matrix[1][1] = 10; // 将第 1 行,第 1 列的元素更改为 10
console.log(matrix[1][1]); // 输出: 10
console.log(matrix);

5. 遍历多维数组

要处理多维数组中的所有元素,通常使用嵌套循环。外层循环遍历行,内层循环遍历列。

// 使用嵌套循环遍历矩阵
for (let i = 0; i < matrix.length; i++) {
  for (let j = 0; j < matrix[i].length; j++) {
    console.log(`第 ${i} 行,第 ${j} 列的元素: ${matrix[i][j]}`);
  }
}

在这段代码中:

  • 外层循环 (i) 从 0 遍历到 matrix.length - 1,代表行数。
  • 内层循环 (j) 从 0 遍历到 matrix[i].length - 1,代表当前行的列数。
  • matrix[i][j] 访问当前行和列的元素。

6. 行长不一的多维数组(锯齿状数组)

虽然矩形多维数组(所有行具有相同数量的列)很常见,但 JavaScript 也允许你创建行长度不同的数组。这些有时被称为“锯齿状数组 (Jagged Arrays)”。

// 创建一个锯齿状数组
let jaggedArray = [
  [1, 2],
  [3, 4, 5, 6],
  [7]
];

console.log(jaggedArray);

// 遍历锯齿状数组
for (let i = 0; i < jaggedArray.length; i++) {
  for (let j = 0; j < jaggedArray[i].length; j++) {
    console.log(`第 ${i} 行,第 ${j} 列的元素: ${jaggedArray[i][j]}`);
  }
}

7. 多维数组的常见操作

7.1 元素求和

计算数组中所有元素的总和。

let matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];

let sum = 0;

for (let i = 0; i < matrix.length; i++) {
  for (let j = 0; j < matrix[i].length; j++) {
    sum += matrix[i][j];
  }
}

console.log("所有元素的总和:", sum); // 输出: 所有元素的总和: 45

7.2 查找最大元素

找出数组中的最大值。

let matrix = [
  [1, 2, 3],
  [4, 9, 6],
  [7, 8, 5]
];

let max = matrix[0][0]; // 最初假设第一个元素是最大的

for (let i = 0; i < matrix.length; i++) {
  for (let j = 0; j < matrix[i].length; j++) {
    if (matrix[i][j] > max) {
      max = matrix[i][j];
    }
  }
}

console.log("最大元素:", max); // 输出: 最大元素: 9

7.3 矩阵转置

创建一个新矩阵,其中行变成列,列变成行。

let matrix = [
  [1, 2, 3],
  [4, 5, 6]
];

function transpose(matrix) {
  let rows = matrix.length;
  let cols = matrix[0].length;
  
  // 创建一个交换了维度的新矩阵
  let transposedMatrix = [];
  
  for (let j = 0; j < cols; j++) {
    transposedMatrix[j] = []; // 初始化每一行
    for (let i = 0; i < rows; i++) {
      transposedMatrix[j][i] = matrix[i][j];
    }
  }
  return transposedMatrix;
}

let transposed = transpose(matrix);
console.log("原始矩阵:", matrix);
console.log("转置矩阵:", transposed);

8. 实践示例与演示

以下是一些演示多维数组用法的实际示例:

8.1 示例 1:表示游戏棋盘

多维数组可用于表示游戏棋盘,例如井字棋(Tic-Tac-Toe)或国际象棋棋盘。

// 表示一个井字棋盘
let ticTacToeBoard = [
  ['X', 'O', ' '],
  [' ', 'X', ' '],
  ['O', ' ', 'X']
];

// 打印棋盘的函数
function printBoard(board) {
  for (let i = 0; i < board.length; i++) {
    console.log(board[i].join('|')); // 用竖线字符连接元素
    if (i < board.length - 1) {
      console.log('-----'); // 行之间的分隔符
    }
  }
}

printBoard(ticTacToeBoard);

这段代码使用二维数组表示井字棋盘。printBoard 函数以用户友好的格式显示棋盘。

8.2 示例 2:存储学生成绩

你可以使用多维数组存储多个学生的多门科目成绩。

// 存储学生成绩
let studentGrades = [
  ['Alice', 85, 90, 92],   // 学生 1: 姓名, 成绩 1, 成绩 2, 成绩 3
  ['Bob', 78, 88, 80],     // 学生 2: 姓名, 成绩 1, 成绩 2, 成绩 3
  ['Charlie', 92, 95, 88]  // 学生 3: 姓名, 成绩 1, 成绩 2, 成绩 3
];

// 计算学生平均成绩的函数
function calculateAverageGrade(student) {
  let sum = 0;
  // 从索引 1 开始,以跳过索引 0 处的学生姓名
  for (let i = 1; i < student.length; i++) {
    sum += student[i];
  }
  return sum / (student.length - 1); // 减去 1 以从计数中排除姓名
}

// 打印每个学生的姓名和平均成绩
for (let i = 0; i < studentGrades.length; i++) {
  let student = studentGrades[i];
  let name = student[0]; // 第一个元素是姓名
  let averageGrade = calculateAverageGrade(student);
  console.log(`${name} 的平均成绩: ${averageGrade.toFixed(2)}`); // 显示保留 2 位小数的平均成绩
}

8.4 示例 3:用于数学运算的矩阵

多维数组通常用于表示数学计算中的矩阵。

// 矩阵乘法
function matrixMultiply(matrixA, matrixB) {
    let rowsA = matrixA.length;
    let colsA = matrixA[0].length;
    let rowsB = matrixB.length;
    let colsB = matrixB[0].length;

    if (colsA !== rowsB) {
        return "矩阵无法相乘。维度不兼容。";
    }

    // 用零初始化结果矩阵
    let resultMatrix = Array(rowsA).fill(null).map(() => Array(colsB).fill(0));

    // 执行乘法
    for (let i = 0; i < rowsA; i++) {
        for (let j = 0; j < colsB; j++) {
            for (let k = 0; k < colsA; k++) {
                resultMatrix[i][j] += matrixA[i][k] * matrixB[k][j];
            }
        }
    }
    return resultMatrix;
}

// 示例矩阵
let matrixA = [[1, 2], [3, 4]];
let matrixB = [[5, 6], [7, 8]];

let product = matrixMultiply(matrixA, matrixB);
console.log("矩阵 A:", matrixA);
console.log("矩阵 B:", matrixB);
console.log("乘积:", product);