一、什麼是二維數組?

在編程中,二維數組是一種特殊的數據結構,它本質上是"數組的數組"。與一維數組存儲線性序列不同,二維數組以表格形式組織數據,包含行和列兩個維度。

概念理解

可以將二維數組想象成一個Excel表格:

  • 整個表格是一個二維數組
  • 每一行是一個一維數組
  • 每個單元格是行數組中的一個元素
// 表格類比
// 行0: [A1, A2, A3]
// 行1: [B1, B2, B3]
// 行2: [C1, C2, C3]

二、二維數組的三種定義方法

方法一:直接定義法

適合已知所有元素且數據量較少的情況。

// 直接定義一個3x3的二維數組
var matrix = [
  ["A1", "A2", "A3"],
  ["B1", "B2", "B3"],
  ["C1", "C2", "C3"]
];

console.log(matrix[1][2]); // 輸出: "B3" - 獲取第2行第3列的元素

優點:代碼簡潔直觀,一目瞭然
缺點:不適合動態或大規模數據初始化

方法二:動態擴展法

適合需要逐步構建二維數組的場景。

// 創建一個空的二維數組
var dynamicArray = new Array();

// 擴展第一行
dynamicArray[0] = new Array();
dynamicArray[0][0] = "第一行第一列";
dynamicArray[0][1] = "第一行第二列";

// 擴展第二行
dynamicArray[1] = new Array();
dynamicArray[1][0] = "第二行第一列";
dynamicArray[1][1] = "第二行第二列";

console.log(dynamicArray.length); // 輸出: 2 - 數組有2行

方法三:循環創建法

最適合處理大量數據或從外部源(如JSON)獲取數據的情況。

// 定義數組的行數和列數
var rows = 4;
var cols = 3;

// 創建二維數組
var twoDArray = new Array(rows);

for (var i = 0; i < rows; i++) {
  twoDArray[i] = new Array(cols);
  for (var j = 0; j < cols; j++) {
    twoDArray[i][j] = "位置[" + i + "][" + j + "]";
  }
}

// 訪問特定元素
console.log(twoDArray[2][1]); // 輸出: "位置[2][1]"

三、二維數組的結構圖解

以下通過UML類圖展示二維數組的結構關係:

JavaScript 二維數組操作示例_數組

四、多維數組的擴展

JavaScript支持創建三維甚至更高維度的數組。

// 創建三維數組示例
var threeDArray = new Array(2); // 第一維:2個元素

for (var x = 0; x < 2; x++) {
  threeDArray[x] = new Array(3); // 第二維:每個元素有3個子元素
  
  for (var y = 0; y < 3; y++) {
    threeDArray[x][y] = new Array(4); // 第三維:每個子元素有4個元素
    
    for (var z = 0; z < 4; z++) {
      threeDArray[x][y][z] = "值[" + x + "][" + y + "][" + z + "]";
    }
  }
}

console.log(threeDArray[1][2][3]); // 輸出: "值[1][2][3]"

五、獲取數組真實長度的方法

JavaScript數組的length屬性有時無法反映真實元素數量,特別是當數組包含非數字鍵時。

// 創建包含混合鍵的數組
var mixedArray = [];
mixedArray[0] = "數字鍵值";
mixedArray["name"] = "字符串鍵值"; // 非數字鍵不影響length

console.log(mixedArray.length); // 輸出: 1 - 僅計算數字索引

// 獲取數組真實元素數量的函數
function getActualArraySize(arr) {
  var count = 0;
  for (var key in arr) {
    if (arr.hasOwnProperty(key)) {
      count++;
    }
  }
  return count;
}

console.log(getActualArraySize(mixedArray)); // 輸出: 2 - 計算所有鍵

六、實際應用場景

場景一:遊戲棋盤表示

// 創建8x8棋盤
var chessboard = new Array(8);

for (var i = 0; i < 8; i++) {
  chessboard[i] = new Array(8);
  for (var j = 0; j < 8; j++) {
    // 初始化棋盤格子
    chessboard[i][j] = {
      piece: null,
      color: (i + j) % 2 === 0 ? "white" : "black"
    };
  }
}

// 放置棋子
chessboard[0][0].piece = " rook";   // 車
chessboard[0][1].piece = "knight"; // 馬
// ... 其他棋子初始化

場景二:數據處理與轉換

// 從多個一維數組創建二維數組
var names = ["張三", "李四", "王五"];
var ages = [25, 30, 28];
var departments = ["技術部", "市場部", "財務部"];

var staffData = [];

for (var i = 0; i < names.length; i++) {
  staffData[i] = [names[i], ages[i], departments[i]];
}

console.log(staffData);
// 輸出: [["張三", 25, "技術部"], ["李四", 30, "市場部"], ["王五", 28, "財務部"]]

七、性能考慮與最佳實踐

  1. 內存使用:二維數組比一維數組佔用更多內存
  2. 訪問速度:連續內存訪問比隨機訪問更快
  3. 預分配空間:提前確定數組大小可提高性能
// 性能優化示例:預分配內存
var optimizedArray = new Array(1000); // 預分配1000行

for (var i = 0; i < 1000; i++) {
  optimizedArray[i] = new Array(100); // 每行預分配100列
  // 後續操作...
}

八、單詞與短語表

JavaScript 二維數組操作示例_二維數組_02