Как создать пустой 2d-массив в javascript?

Как создать пустой 2D-массив в Javascript (не зная, сколько строк или столбцов будет в новом массиве)?

Если это простой массив var newArray = new Array();, я могу назначить столько элементов, сколько захочу. Но как насчет 2D-массива? Могу ли я создать его без указания числа строк и столбцов? и как мне получить доступ к элементам после этого (myArray[0][1] или myArray[0,1])?

Ответ 1

Да, вы можете создать пустой массив и затем вставить в него данные. Нет необходимости определять длину сначала в JavaScript.
Отъезд jsFiddle Live Demo

Определить:

var arr = [[],[]];

Нажмите данные:

arr[0][2] = 'Hi Mr.A';
arr[1][3] = 'Hi Mr.B';

Чтение данных:

alert(arr[0][2]);
alert(arr[1][3]);

Ответ 2

Вы можете создать пустой массив размером 6 x 6, например:

var myGrid = [...Array(6)].map(e => Array(6));
  • Array(6) генерирует массив с длиной = 6 и полон undefined значений.
  • Мы отображаем этот массив в другой массив, полный undefined значений.
  • В итоге мы получаем сетку 6х6, заполненную undefined позициями.

Если вам нужно инициализировать сетку со значением по умолчанию:

var value = 'foo'; // by default
var myGrid = [...Array(6)].map(e => Array(6).fill(value));

Теперь у вас есть сетка 6 х 6, заполненная 'foo'.

Ответ 3

В Javascript нет двухмерных массивов.

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

Пустой зубчатый массив создается так же, как любой другой пустой массив:

var myArray = new Array();

Вы также можете использовать пустой литерал массива:

var myArray = [];

Чтобы поместить любые элементы в массив с зазубрингом, сначала нужно вставить в него внутренние массивы, например:

myArray.push([]);
myArray[0][0] = 'hello';

Вы также можете создать массив, содержащий множество пустых массивов с начала:

var myArray = [[],[],[]];

Это дает вам зубчатый массив без каких-либо элементов, но готовится с тремя внутренними массивами.

Как массив массивов, вы получаете доступ к элементам с помощью myArray[0][1].

Ответ 4

Скажем, вы хотите создать 2d массив (т.е. матрицу) размером 100x100, вы можете сделать это в одну строку, например так:

var 2darray = new Array(100).fill(null).map(()=>new Array(100).fill(null));

Это создаст матрицу NULL размером 100x100. Замените 100x100 на любые размеры, которые вы хотите, а на ноль - на то, которое вы предпочитаете по умолчанию, или оставьте пустым значение для неопределенного значения.

Ответ 5

var myArray = [
    ["cats","dogs","monkeys","horses"],
    ["apples","oranges","pears","bananas"]
];
document.write(myArray[0][2]) //returns "monkeys"

Ответ 6

Две вещи:

1) Свойство length массива неправильно сообщает длину массива, если вызывается после var myArray = [[], []]; выражение. Технически, поскольку пустые массивы определены, они подсчитываются по свойству length, но в духе свойства length он действительно должен возвращать 0, потому что не все непустые элементы добавлены к любому из массивов.

Минимальная работа заключается в использовании двух вложенных циклов (в), один для 1-го массива и один для второго массива, а также для подсчета элементов undefined.

2) Расширение примера Сиамака А.Мотлага и добавление аор ([2] [4]) = 'Hi Mr.C'; присваивание не выполняется с помощью параметра "Неподключить TypeError: невозможно установить свойство" 4 "из undefined".

См. jsFiddle: http://jsfiddle.net/howardb1/zq8oL2ds/

Вот копия этого кода:

var arr = [[],[]];

alert( arr.length );  // wrong!

var c = 0;
for( var i in arr )
  for( var j in arr[ i ] )
    if( arr[ i ][ j ] != undefined )
      ++c;
alert( c );  // correct

arr[0][2] = 'Hi Mr.A';
alert(arr[0][2]);

arr[1][3] = 'Hi Mr.B';
alert(arr[1][3]);

arr[2][4] = 'Hi Mr.C';  // At this point I'm getting VM558:62 Uncaught TypeError: Cannot set property '4' of undefined
alert(arr[2][4]);

var c = 0;
for( var i in arr )
  for( var j in arr[ i ] )
    if( arr[ i ][ j ] != undefined )
      ++c;
alert( c );

Почему закончилось третье присвоение? Что касается инструкции создания [[], []], то это говорит о том, что первый массив был действителен для 0 и 1, но не 2 или 2 и 3 были одобрены для второго массива, но не 4?

Самое главное, как бы я определил массив в массиве, который мог бы хранить объекты даты в первом и втором массивах. Я использую jQuery-UI DatePicker, который ожидает массив дат, как и в объектах даты, который я расширил, чтобы использовать второй массив дат, чтобы содержать объекты даты, которые содержат время, поэтому я могу отслеживать несколько дат и несколько раз в день.

Спасибо.

Ответ 7

Это также работает как выражение:

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

Я не знаю, как это оценивается с точки зрения производительности с остальными ответами здесь, если у вас есть ключ, дайте мне знать в комментариях.

Если вы заранее не знаете длину массива, PLS имеет в виду, что вы можете использовать либо push([]), либо splice(), если вы хотите нажать/удалить/заменить новый элемент вместо существующего.

Ответ 8

создать 2d-массивы как arr2d = [[]] создать 3d-массивы как arr3d = [[[]]]