原文: JavaScript 2D Array – Two Dimensional Arrays in JS

在 JavaScript 编程中,我们都习惯于创建和处理一维数组。这些数组中包含具有类似的数据类型或多种数据类型的元素。

但是我们也可以了解一下 JS 中的二维数组。

在这篇文章中,你将了解什么是二维数组以及它们在 JavaScript 中是如何运行的。它与其他编程语言有很大的不同,因为从技术上讲,JavaScript 中没有二维数组。

什么是二维数组

二维数组是一个数据元素的集合,以行和列的网格状结构排列。数组中的每个元素都被称为单元,可以通过其行和列的索引进行访问。

[ a1, a2, a3, ..., an,
  b1, b2, b3, ..., bn,
  c1, c2, c3, ..., cn,
  .
  .
  .
  z1, z2, z3, ..., zn ]

在 JavaScript 中,没有像其他常用的编程语言如 C、C++ 和 Java 那样直接创建二维数组的语法。

你可以通过一个数组的数组在 JavaScript 中创建二维数组,像下面这样:

let twoDimensionalArr = [ [ a1, a2, a3, ..., an ],
[ b1, b2, b3, ..., bn ],
[ c1, c2, c3, ..., cn ],
.
.
.
[ z1, z2, z3, ..., zn ] ];

但是有一个限制。需要注意的是,二维数组有一个固定的大小。这意味着,一旦它们被创建,行和列的数量应该是固定的。而且,每一行应该有类似数量的元素(列)。

例如,下面的数组有三行和四个元素:

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

其局限性在于,对于锯齿形数组,你不能指定固定的行和列。这意味着一个锯齿形数组可以有 m 行,每行有不同数量的元素。

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

为什么要在 JavaScript 中使用二维数组

说到这里,你可能会问自己二维数组的重要性,特别是如果这是你第一次阅读关于二维数组的文章。

在 JavaScript 中,我们使用二维数组,也称为矩阵,以一种结构化和有组织的方式来存储和处理数据。

  • 它们允许有效地存储和操作大量的数据,例如在图像或视频处理、科学模拟和电子表格应用中。
  • 二维数组还可以使用矩阵运算,如矩阵乘法和转置,这可以简化复杂的计算,使代码更易读。
  • 二维数组可以表示线性代数中的数学矩阵和广泛的数据,如图形、地图和表格。
  • 二维数组常用于涉及数据表、图像处理和游戏开发的应用中。

如何访问 JavaScript 二维数组中的元素

在学习如何在 JavaScript 中创建二维数组之前,我们首先要学习如何访问二维数组中的元素。

你可以使用两个索引来访问二维数组中的元素,一个是行的索引,一个是列的索引。假设你有下面这个二维数组:

let MathScore = [
    ['John Doe', 20, 60, 'A'],
    ['Jane Doe', 10, 52, 'B'],
    ['Petr Chess', 5, 24, 'F'],
    ['Ling Jess', 28, 43, 'A'],
    ['Ben Liard', 16, 51, 'B']
];

上面是一个锯齿状的数组,其中每个元素都保存着学生的姓名、测试分数、考试分数和等级。你可以使用行和列的索引来访问特定的元素,如下面的语法:

arrayName[rowIndex][columnIndex]

为了更好地理解这一点,让我们使用 console.table(arrayName) 将上面的二维数组转换为表格。

注意:确保用你的二维数组的名称替换 arrayName。在我的例子中,它是 MathScore

你会得到这样的输出,显示行和列的索引。记住,数组是零索引的,也就是说,项目的索引是从 0 开始的,而不是 1。

s_357699FE5D3810E96F0B6815928F66401CBB5DFE39FAA8BDA7338BEC543A022F_1673843651418_Untitled.drawio+3

请注意,(index) 列和行是为了表示内部数组的索引。

你使用两个方括号来访问二维或多维数组的一个元素。第一个是访问行,第二个是访问指定行中的元素。

console.log(MathScore[4][0]); // returns 'Ben Liard'
console.log(MathScore[2][1]); // returns 5
console.log(MathScore[1][3]); // returns 'B'
console.log(MathScore[2][2]); // returns 24

如何访问一个二维数组的第一个和最后一个元素

有时你可能需要找到一个二维数组的第一个和最后一个元素。你可以使用行和列的第一个和最后一个索引来完成这个任务。

第一个元素的行和列的索引总是 0,这意味着你将使用 arrayName[0][0],

然而,最后一个元素的索引可能不容易确定。例如,在上面的例子中,第一个元素是 “John Doe”,而最后一个是 “B”:

console.log(MathScore[0][0]); // returns 'John Doe'
console.log(MathScore[MathScore.length-1][(MathScore[MathScore.length -1]).length - 1]); // returns 'B'

如何将一个二维数组的所有元素相加

在某些情况下,你的二维数组的所有元素可能都是数字,你可能需要将它们相加。你可以用一个嵌套的循环来做这件事。你将首先遍历各行,然后,对于每一行,你遍历其元素。

let numberArr = [
  [10, 20, 60],
  [8, 10, 52],
  [15, 5, 24],
  [26, 28, 43],
  [12, 16, 51]
];

var sum = 0;
numberArr.forEach((row) => {
  row.forEach((element) => {
    sum += element;
  });
});
console.log("The sum of all elements in the array is:" + sum); // returns "The sum of all elements in the array is: 380"

如何在 JavaScript 中操作二维数组

你可以像操作一维数组一样使用一般的数组方法来操作二维数组,比如 pop、push、splice 等等。

让我们先来学习如何在二维数组中添加/插入一个新的行和元素。

如何在二维数组中插入一个元素

你可以用 push()unshift() 方法向二维数组中添加一个或许多元素。

push() 方法将元素添加到二维数组的结尾,而 unshift() 方法将元素添加到二维数组的开头。

let MathScore = [
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
];

MathScore.push(["Tom Right", 30, 32, "B"]);

MathScore.unshift(["Alice George", 28, 62, "A"]);

当你 console.log()console.table() 数组时,你会看到新的行已经被添加:

[
  ["Alice George", 28, 62, "A"],
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"],
  ["Tom Right", 30, 32, "B"]
]

你也可以向内层数组添加元素,但是只向一个内层数组推送而不影响所有数组元素的做法是错误的。这是因为二维数组的每个元素数组应该拥有相同数量的元素。

MathScore[0].push("B");

你可以一次性向所有元素数组添加元素,而不是只影响一个数组元素:

let MathScore = [
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
];

MathScore.forEach((score) => {
  let totalScore = score[1] + score[2];
  score.push(totalScore);
});

console.log(MathScore);

这将返回:

[
  ["John Doe", 20, 60, "A", 80],
  ["Jane Doe", 10, 52, "B", 62],
  ["Petr Chess", 5, 24, "F", 29],
  ["Ling Jess", 28, 43, "A", 71],
  ["Ben Liard", 16, 51, "B", 67]
]

你也可以使用 unshift() 方法在开头插入元素,使用 splice() 方法在数组的中间插入:

let MathScore = [
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
];

MathScore.splice(2, 0, ["Alice George", 28, 62, "A"]);

在上面,1 是你想让新数组插入的位置(记住它是零索引的),使用 0,所以它没有删除任何元素,然后第三个参数是要添加的数组。

这就是输出结果:

[
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Alice George", 28, 62, "A"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
]

如何从二维数组中删除一个元素

你也可以用 pop()shift() 方法从一个二维数组的开头和结尾处移除元素。这与 push()unshift() 方法的工作原理类似,但这次你不需要向这些方法添加任何参数。

let MathScore = [
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
];

MathScore.pop();

MathScore.shift();

当你 console.log()console.table() 数组时,你会看到第一个和最后一个数组元素已经被移除:

[
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
]

你也可以从每个数组元素中移除元素:

let MathScore = [
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
];

MathScore.forEach((score) => {
  score.pop();
});

console.log(MathScore);

这将返回:

[
  ["John Doe", 20, 60],
  ["Jane Doe", 10, 52],
  ["Petr Chess", 5, 24],
  ["Ling Jess", 28, 43],
  ["Ben Liard", 16, 51]
]

你也可以使用 shift() 方法来移除开头的元素,使用 splice() 方法来移除特定位置上的数组元素:

let MathScore = [
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
];

MathScore.splice(2, 1);

在上面的代码中,你从 MathScore 二维数组的索引 2 的位置删除了一个项目。这将输出:

[
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
]

注意:所有的 JavaScript 数组方法都会对二维数组进行操作,因为它是一个数组的数组。你只有在调整元素数组中的单个元素时才需要注意。你通过遍历对所有元素进行类似的改变,尽管 JavaScript 中的二维数组并不严格。

如何在 JavaScript 中创建二维数组

创建一个多维数组有两种选择。你可以用数组字面量表示法手动创建数组,它使用方括号 [] 来包裹一个用逗号分隔的元素列表。你也可以使用一个嵌套的循环。

如何使用数组字面量表示法创建一个二维数组

这就像我们一直在考虑的例子一样,使用下面的语法:

let arrayName = [
[ elements ],
[ elements ],
[ elements ], ... ];

例如,下面是一个二维数组,保存了每个学生的数学分数和等级的信息:

let MathScore = [
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
];

如何使用嵌套 for 循环创建一个二维数组

有很多方法可以做到这一点。但一般来说,你要创建一个嵌套循环,第一个循环将遍历行,而第二个循环将遍历内部数组(列)中的元素:

let arr = [];
let rows = 4;
let columns = 3;

// creating two-dimensional array
for (let i = 0; i < rows; i++) {
  arr[i] = [];
  for (let j = 0; j < columns; j++) {
    arr[i][j] = j;
  }
}

console.log(arr);

在这个例子中,j 的索引被使用并将输出:

[
  [0, 1, 2],
  [0, 1, 2],
  [0, 1, 2],
  [0, 1, 2]
]

你可以决定创建一个数字,初始化为 0,然后随着遍历增加,这样你就不会对所有元素都有相同的数字:

let arr = [];
let rows = 4;
let columns = 3;

let value = 0;
// creating two-dimensional array
for (let i = 0; i < rows; i++) {
  arr[i] = [];
  for (let j = 0; j < columns; j++) {
    arr[i][j] = value++;
  }
}

console.log(arr);

这将返回:

[
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8],
  [9, 10, 11]
]

你也可以决定创建一个接受这些值作为参数的函数:

const create2Darr = (rows, columns) => {
  let arr = [];
  let value = 0;

  // creating two-dimensional array
  for (let i = 0; i < rows; i++) {
    arr[i] = [];
    for (let j = 0; j < columns; j++) {
      arr[i][j] = value++;
    }
  }
  console.log(arr);
};

let rows = 4;
let columns = 3;
create2Darr(rows, columns);

如何在 JavaScript 中更新二维数组中的元素

这与你处理一维数组的方式非常相似,你可以通过使用索引分配另一个值,来更新一个数组的值。

let array = [1, 2, 3];
array[1] = 5;

console.log(array); // returns [1, 5, 3]

你可以用同样的方法来改变整个行,甚至单个元素:

let MathScore = [
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
];

MathScore[1] = ["Alice George", 28, 62, "A"];
console.log(MathScore);

这将用这个新的数组替换索引 1 的值:

[
  ["John Doe", 20, 60, "A"],
  ["Alice George", 28, 62, "A"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
]

你可以通过跟踪行和列的索引并更新它们的值来更新单个元素:

let MathScore = [
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Petr Chess", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
];

MathScore[2][0] = "Jack Jim";
console.log(MathScore);

这将把索引为 2 的那一行的名字改为 “Jack Jim”,如下图所示:

[
  ["John Doe", 20, 60, "A"],
  ["Jane Doe", 10, 52, "B"],
  ["Jack Jim", 5, 24, "F"],
  ["Ling Jess", 28, 43, "A"],
  ["Ben Liard", 16, 51, "B"]
]

总结

在这篇文章中,你了解了什么是二维数组,以及它们在 JavaScript 中是如何运行的。

重要的是要知道,二维数组在 JavaScript 中的运行方式与一维数组非常相似,所以请放心使用 JavaScript 方法来调整和操作它们。

祝你编码愉快!

你可以访问我的网站以阅读我的 150 多篇文章。你也可以使用搜索栏来查看我是否写过特定的文章。