⚡ JavaScript

Двумерные массивы в JavaScript (Node.js): подробное руководство

Двумерные массивы в JavaScript

Что такое двумерный массив?

Представь себе шахматную доску или кинозал с рядами и местами. У каждого места есть два адреса: номер ряда и номер места в этом ряду.

В программировании такие таблицы называются двумерными массивами (или матрицами). Это массив, внутри которого находятся другие массивы.

Двумерные массивы помогают хранить данные, которые удобно представлять в виде таблицы: расписание уроков, карту острова с сокровищами, результаты игр или статистику постов в соцсетях.

Как создать двумерный массив

Самый простой способ — создать массив, внутри которого перечислить другие массивы:

// Создаём таблицу 3 ряда по 4 места
let кинозал = [
  [1, 2, 3, 4],    // первый ряд
  [5, 6, 7, 8],    // второй ряд
  [9, 10, 11, 12]  // третий ряд
];

Как обратиться к элементу

Чтобы получить элемент из таблицы, нужно указать два индекса: сначала номер строки (ряда), потом номер столбца (места).

Важно: счёт начинается с нуля!

let кинозал = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12]
];

console.log(кинозал[0][0]); // 1 — первый ряд, первое место
console.log(кинозал[1][2]); // 7 — второй ряд, третье место
console.log(кинозал[2][3]); // 12 — третий ряд, четвёртое место

Как изменить элемент

Просто присваиваем новое значение по нужным индексам:

let кинозал = [
  [1, 2, 3],
  [4, 5, 6]
];

кинозал[0][2] = 99; // Меняем третий элемент в первом ряду
console.log(кинозал[0]); // [1, 2, 99]

Как заполнить массив с клавиатуры

Часто нужно создать массив, размер которого задаёт пользователь. Для этого используем циклы:

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

let rows = 2;
let cols = 3;
let массив = [];

// Заполняем массив вручную для примера
for (let i = 0; i < rows; i++) {
  массив[i] = [];
  for (let j = 0; j < cols; j++) {
    массив[i][j] = (i + 1) * 10 + (j + 1); // Просто пример чисел
  }
}

console.log(массив);
// Вывод: [ [ 11, 12, 13 ], [ 21, 22, 23 ] ]

Как пройти по всем элементам (обход)

Используем вложенные циклы — один для строк, другой для столбцов:

let таблица = [
  [1, 2, 3],
  [4, 5, 6]
];

for (let i = 0; i < таблица.length; i++) {
  for (let j = 0; j < таблица[i].length; j++) {
    console.log(`Элемент [${i}][${j}] = ${таблица[i][j]}`);
  }
}

Разбор типичных задач

Задача 1: Создание схемы кинозала

Нужно создать таблицу, где каждый элемент — это номер места. Пользователь вводит количество рядов и мест в ряду.

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('Введите кол-во рядов: ', (rows) => {
  rl.question('Введите кол-во мест в ряду: ', (cols) => {
    rows = Number(rows);
    cols = Number(cols);
    let схема = [];

    for (let i = 0; i < rows; i++) {
      схема[i] = [];
      for (let j = 0; j < cols; j++) {
        схема[i][j] = `Р${i+1}М${j+1}`;
      }
    }

    console.log('Схема зала:');
    for (let i = 0; i < rows; i++) {
      console.log(схема[i].join(' | '));
    }
    rl.close();
  });
});

Задача 2: Поиск максимального элемента

Найти самое большое число в таблице (например, магнитуду землетрясения).

let данные = [
  [4.5, 3.2],
  [5.1, 2.8]
];

let максимум = данные[0][0];

for (let i = 0; i < данные.length; i++) {
  for (let j = 0; j < данные[i].length; j++) {
    if (данные[i][j] > максимум) {
      максимум = данные[i][j];
    }
  }
}

console.log(`Максимальная магнитуда: ${максимум}`); // 5.1

Задача 3: Замена элемента по условию

На складе нужно заменить все товары с количеством 0 на значение 1 (добавили товар).

let склад = [
  [5, 0, 3],
  [0, 8, 2],
  [1, 0, 6]
];

for (let i = 0; i < склад.length; i++) {
  for (let j = 0; j < склад[i].length; j++) {
    if (склад[i][j] === 0) {
      склад[i][j] = 1;
    }
  }
}

console.log(склад);
// [ [5, 1, 3], [1, 8, 2], [1, 1, 6] ]

Частые ошибки новичков

  • Путают индексы: первый индекс — строка, второй — столбец. массив[строка][столбец]
  • Забывают, что счёт с нуля: первый элемент имеет индекс 0, а не 1.
  • Не создают внутренний массив: массив[i] = [] нужно писать обязательно, иначе будет ошибка.
  • Путают длину строк и столбцов: массив.length — количество строк, массив[0].length — количество столбцов.
  • Выход за границы массива: если массив размером 3x4, то индексы строк — 0,1,2, а столбцов — 0,1,2,3.

Итоговый пример: карта острова Капитана Сильвера

У нас есть карта 3x3. Символ 'X' — это сокровище, 'O' — пусто. Нужно найти координаты сокровища.

let карта = [
  ['O', 'O', 'X'],
  ['O', 'O', 'O'],
  ['O', 'O', 'O']
];

let найдено = false;

for (let i = 0; i < карта.length; i++) {
  for (let j = 0; j < карта[i].length; j++) {
    if (карта[i][j] === 'X') {
      console.log(`Сокровище найдено! Ряд ${i+1}, место ${j+1}`);
      найдено = true;
    }
  }
}

if (!найдено) {
  console.log('Сокровище не найдено :(');
}

Почему это важно?

Двумерные массивы — это основа для работы с таблицами, изображениями (каждый пиксель — это элемент), играми (карта, поле боя), базами данных и многим другим. Научившись работать с ними, ты сможешь решать настоящие задачи из реального программирования!