JavaScript 多维数组
什么是多维数组?
在JavaScript中,多维数组是指"数组的数组",即数组的元素也是数组。最常见的多维数组是二维数组,类似于表格结构,有行和列。然而,JavaScript原生并不支持真正意义上的多维数组,而是通过数组嵌套来实现的。
提示
虽然我们称之为"多维数组",但在JavaScript中实际上是嵌套数组结构,每个数组元素又包含一个数组。
创建二维数组
直接初始化法
最直观的方式是直接在声明时初始化:
javascript
// 创建一个3x3的二维数组
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
console.log(matrix);
// 输出:
// [
// [1, 2, 3],
// [4, 5, 6],
// [7, 8, 9]
// ]
使用循环创建
如果需要创建较大的二维数组,可以使用循环:
javascript
// 创建一个3x3的空二维数组
const matrix = [];
for (let i = 0; i < 3; i++) {
matrix[i] = []; // 创建内部数组
for (let j = 0; j < 3; j++) {
matrix[i][j] = 0; // 填充默认值
}
}
console.log(matrix);
// 输出: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
使用Array.from()方法
利用ES6的Array.from()
方法可以更简洁地创建二维数组:
javascript
// 创建一个3x3的二维数组
const rows = 3;
const cols = 3;
const matrix = Array.from({ length: rows }, () =>
Array.from({ length: cols }, () => 0)
);
console.log(matrix);
// 输出: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
访问多维数组元素
要访问多维数组中的元素,我们需要使用多个索引:
javascript
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// 访问第2行第3列的元素(值为6)
const element = matrix[1][2];
console.log(element); // 输出: 6
// 修改第1行第1列的元素
matrix[0][0] = 10;
console.log(matrix);
// 输出:
// [
// [10, 2, 3],
// [4, 5, 6],
// [7, 8, 9]
// ]
遍历多维数组
使用嵌套for循环
javascript
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// 使用嵌套for循环遍历
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[i].length; j++) {
console.log(`位置 (${i},${j}) 的值是: ${matrix[i][j]}`);
}
}
使用forEach()方法
javascript
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// 使用forEach遍历
matrix.forEach((row, i) => {
row.forEach((value, j) => {
console.log(`位置 (${i},${j}) 的值是: ${value}`);
});
});
使用for...of循环
javascript
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// 使用for...of循环(更简洁,但无索引)
for (const row of matrix) {
for (const value of row) {
console.log(value);
}
}
多维数组的操作
添加新行
javascript
const matrix = [
[1, 2, 3],
[4, 5, 6]
];
// 添加新行
matrix.push([7, 8, 9]);
console.log(matrix);
// 输出:
// [
// [1, 2, 3],
// [4, 5, 6],
// [7, 8, 9]
// ]
添加新列
由于JavaScript没有真正的二维数组,添加新列需要遍历每一行:
javascript
const matrix = [
[1, 2],
[3, 4],
[5, 6]
];
// 给每一行添加新元素(相当于添加新列)
for (let i = 0; i < matrix.length; i++) {
matrix[i].push(matrix[i][0] + matrix[i][1]);
}
console.log(matrix);
// 输出:
// [
// [1, 2, 3],
// [3, 4, 7],
// [5, 6, 11]
// ]
删除行或列
javascript
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// 删除第二行
matrix.splice(1, 1);
console.log(matrix);
// 输出: [[1, 2, 3], [7, 8, 9]]
// 删除所有行的第一列
for (let i = 0; i < matrix.length; i++) {
matrix[i].splice(0, 1);
}
console.log(matrix);
// 输出: [[2, 3], [8, 9]]
不规则多维数组
JavaScript允许创建每行长度不同的多维数组:
javascript
const jaggedArray = [
[1, 2, 3],
[4, 5],
[6, 7, 8, 9]
];
console.log(jaggedArray);
// 输出:
// [
// [1, 2, 3],
// [4, 5],
// [6, 7, 8, 9]
// ]
三维及更高维度数组
我们也可以创建三维或更高维度的数组:
javascript
// 创建一个2x2x3的三维数组
const cube = [
[
[1, 2, 3],
[4, 5, 6]
],
[
[7, 8, 9],
[10, 11, 12]
]
];
// 访问元素
console.log(cube[1][0][1]); // 输出: 8
实际应用案例
1. 棋盘游戏
多维数组非常适合表示棋盘游戏(如井字游戏)的状态:
javascript
// 井字游戏棋盘表示
const ticTacToe = [
['X', 'O', 'X'],
['O', 'X', 'O'],
['O', 'X', 'X']
];
// 检查行胜利
function checkRowWin(board, player) {
for (let i = 0; i < 3; i++) {
if (board[i][0] === player &&
board[i][1] === player &&
board[i][2] === player) {
return true;
}
}
return false;
}
console.log(checkRowWin(ticTacToe, 'X')); // 输出: false
2. 图片处理
二维数组可以用来表示像素矩阵,处理图像:
javascript
// 简化的黑白图像表示(0代表黑色,1代表白色)
const image = [
[0, 0, 1, 0, 0],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[0, 0, 1, 0, 0]
];
// 反转图像颜色
function invertImage(img) {
const result = [];
for (let i = 0; i < img.length; i++) {
result[i] = [];
for (let j = 0; j < img[i].length; j++) {
result[i][j] = img[i][j] === 0 ? 1 : 0;
}
}
return result;
}
const invertedImage = invertImage(image);
console.log(invertedImage[2]); // 输出: [0, 0, 0, 0, 0]
3. 数据分析
多维数组可以用于数据分析和处理表格数据:
javascript
// 学生成绩表(姓名, 数学, 英语, 科学)
const grades = [
["Alice", 85, 90, 92],
["Bob", 75, 80, 85],
["Charlie", 90, 95, 85],
["Diana", 95, 85, 90]
];
// 计算每个学生的平均分
function calculateAverages(gradeData) {
return gradeData.map(student => {
const name = student[0];
const scores = student.slice(1);
const average = scores.reduce((sum, score) => sum + score, 0) / scores.length;
return [name, average.toFixed(1)];
});
}
const averages = calculateAverages(grades);
console.log(averages);
// 输出: [["Alice", "89.0"], ["Bob", "80.0"], ["Charlie", "90.0"], ["Diana", "90.0"]]
多维数组的性能考虑
当处理大型多维数组时,需要注意以下几点:
- 内存占用 - 大型多维数组会占用大量内存
- 访问速度 - 深层嵌套的多维数组访问效率较低
- 数据结构选择 - 有些情况下,对象或Map可能比多维数组更合适
警告
处理大型多维数组时,请注意内存使用情况,特别是在浏览器环境中。
总结
JavaScript多维数组是通过数组嵌套实现的数据结构,最常见的是二维数组。主要特点包括:
- 创建方式多样,包括直接初始化、循环创建和使用Array.from()方法
- 访问和修改元素需要使用多个索引
- 可以通过多种方法遍历,如嵌套循环、forEach()和for...of
- 支持不规则数组(每行长度不一致)
- 可扩展到三维及更高维度
- 在游戏开发、图像处理和数据分析等领域有广泛应用
随着你对JavaScript的深入学习,你会发现多维数组在各种复杂算法和应用场景中都非常有用。
练习题
- 创建一个5x5的二维数组,并用1-25的数字按顺序填充。
- 编写一个函数,将二维数组转置(行变列,列变行)。
- 实现一个函数,判断某个数字是否存在于给定的二维数组中。
- 编写一个函数,计算二维数组中所有元素的总和。
- 模拟一个简单的迷宫,使用二维数组表示墙壁和通道,并尝试找出从入口到出口的路径。
进一步学习资源
- MDN Web文档关于数组的详细介绍
- JavaScript数据结构与算法书籍
- 在线编程平台上的数组相关练习(如LeetCode、HackerRank)