Как я могу создать двумерный массив в JavaScript? - PullRequest
1030 голосов
/ 08 июня 2009

Я читал в Интернете, и некоторые места говорят, что это невозможно, некоторые говорят, что это возможно, а затем приводят пример, а другие опровергают пример и т.д.

  1. Как объявить двумерный массив в JavaScript? (при условии, что это возможно)

  2. Как я могу получить доступ к его членам? (myArray[0][1] или myArray[0,1]?)

Ответы [ 42 ]

1165 голосов
/ 08 июня 2009

var items = [
  [1, 2],
  [3, 4],
  [5, 6]
];
console.log(items[0][0]); // 1
console.log(items);
403 голосов
/ 08 июня 2009

Вы просто делаете каждый элемент массива массивом.

var x = new Array(10);

for (var i = 0; i < x.length; i++) {
  x[i] = new Array(3);
}

console.log(x);
179 голосов
/ 09 июня 2009

Аналогично ответу activa, вот функция для создания n-мерного массива:

function createArray(length) {
    var arr = new Array(length || 0),
        i = length;

    if (arguments.length > 1) {
        var args = Array.prototype.slice.call(arguments, 1);
        while(i--) arr[length-1 - i] = createArray.apply(this, args);
    }

    return arr;
}

createArray();     // [] or new Array()

createArray(2);    // new Array(2)

createArray(3, 2); // [new Array(2),
                   //  new Array(2),
                   //  new Array(2)]
79 голосов
/ 08 июня 2009

Javascript имеет только одномерные массивы, но вы можете создавать массивы из массивов, как указывали другие.

Следующая функция может использоваться для построения двумерного массива с фиксированными размерами:

function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

Количество столбцов на самом деле не важно, потому что не требуется указывать размер массива перед его использованием.

Тогда вы можете просто позвонить:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...
70 голосов
/ 22 января 2013

Самый простой способ:

var myArray = [[]];
44 голосов
/ 08 июня 2009

Причина, по которой некоторые говорят, что это невозможно, заключается в том, что двумерный массив на самом деле является просто массивом массивов. Другие комментарии здесь предоставляют совершенно правильные методы создания двумерных массивов в JavaScript, но самая чистая точка зрения будет состоять в том, что у вас есть одномерный массив объектов, каждый из этих объектов будет одномерным массивом, состоящим из двух элементов.

Итак, это причина противоречивых точек зрения.

34 голосов
/ 09 марта 2018

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

Array.from(Array(2), () => new Array(4))

2 и 4 - первое и второе измерения соответственно.

Мы используем Array.from, который может принимать массивоподобный параметр и необязательное отображение для каждого из элементов.

Array.from (arrayLike [, mapFn [, thisArg]])

var arr = Array.from(Array(2), () => new Array(4));
arr[0][0] = 'foo';
console.info(arr);

Тот же трюк можно использовать для Создание массива JavaScript, содержащего 1 ... N


В качестве альтернативы (но более неэффективно 12% с n = 10,000)

Array(2).fill(null).map(() => Array(4))

Снижение производительности связано с тем, что мы должны инициализировать первые значения измерений для запуска .map. Помните, что Array не будет распределять позиции до тех пор, пока вы не сделаете заказ через .fill или прямое присвоение значения.

var arr = Array(2).fill(null).map(() => Array(4));
arr[0][0] = 'foo';
console.info(arr);

Последующие действия

Вот метод, который кажется правильным, , но имеет проблемы .

 Array(2).fill(Array(4)); // BAD! Rows are copied by reference

Несмотря на то, что он возвращает желаемый двумерный массив ([ [ <4 empty items> ], [ <4 empty items> ] ]), есть загвоздка: массивы первого измерения были скопированы по ссылке. Это означает, что arr[0][0] = 'foo' фактически изменит две строки вместо одной.

var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);
29 голосов
/ 08 августа 2013

Мало кто показывает использование толчка:
Чтобы привнести что-то новое, я покажу вам, как инициализировать матрицу некоторым значением, например: 0 или пустой строкой "".
Напомним, что если у вас есть массив из 10 элементов, в javascript последний индекс будет 9!

function matrix( rows, cols, defaultValue){

  var arr = [];

  // Creates all lines:
  for(var i=0; i < rows; i++){

      // Creates an empty line
      arr.push([]);

      // Adds cols to the empty line:
      arr[i].push( new Array(cols));

      for(var j=0; j < cols; j++){
        // Initializes:
        arr[i][j] = defaultValue;
      }
  }

return arr;
}

примеры использования:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0
26 голосов
/ 26 мая 2014

Два лайнера:

var a = []; 
while(a.push([]) < 10);

Будет сгенерирован массив a длиной 10, заполненный массивами. (Push добавляет элемент в массив и возвращает новую длину)

24 голосов
/ 15 февраля 2016

Самый разумный ответ:

var nrows = ~~(Math.random() * 10);
var ncols = ~~(Math.random() * 10);
console.log(`rows:${nrows}`);
console.log(`cols:${ncols}`);
var matrix = new Array(nrows).fill(0).map(row => new Array(ncols).fill(0));
console.log(matrix);

Обратите внимание, что мы не можем напрямую заполнить строки, так как заполнение использует конструктор поверхностного копирования, поэтому все строки будут совместно использовать одну и ту же память ... вот пример, который демонстрирует, как каждый Строка будет общей (взято из других ответов):

// DON'T do this: each row in arr, is shared
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo'; // also modifies arr[1][0]
console.info(arr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...