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); // 输出: 所有元素的总和: 457.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); // 输出: 最大元素: 97.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);