2013-05-12 6 views
10

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

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

+1

дубликат: http://stackoverflow.com/questions/6495187/best-way-to-generate-empty-2d-array http://stackoverflow.com/questions/7521796/is-it-possible-to -create-a-empty-multimimensional-array-in-javascript-jquery и многие другие –

+0

Я предположил, что 'var row_major = массив (высота) .map (function() {return Array (width);});' будет делать трюк, но, наконец, понадобился 2D-массив сегодня и обнаружил, что он этого не делает. Черт. –

ответ

19

Да, вы можете создать пустой массив и затем вставить в него данные. Нет необходимости сначала определять длину в 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]); 
+0

и как мы определяем его тогда 'new Array()()'? – meks

+0

@meks Нравится это: 'new Array ([])', Check the demo. Помог ли ответ решить вашу проблему? –

+0

Для динамической совокупности массива см. Здесь ответ Гуффа. – Pravin

10

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

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

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

var myArray = new Array(); 

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

var myArray = []; 

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

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

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

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

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

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

+0

Thanks Это очень полезно – meks

+0

Чистая концепция для 2D-массива. – Pravin

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

Вы можете создать 6 х 6 пустой обр ау так:

var myarray = [...Array(6).keys()].map(i => Array(6)); 
  • Array(6) генерирует массив с длиной = 6 и полна undefined значений.
  • [...Array(6).keys()] дает массив целых чисел: [0, 1, 2, 3, 4, 5]
  • Я отображающую этот массив в другой массив полный undefined значений.
  • В итоге мы получаем сетку 6x6, полную undefined позиций.
+1

Недопустимый трюк прямо здесь ^^^ отлично работает для произвольных 2D-массивов. Здесь он находится в многоразовой форме: 'const create2dArray = (rows, columns) => [... Array (rows) .keys()]. ​​Map (i => Array (columns))' – rkd

+0

Дальнейшие объяснения было бы хорошо;) –

+1

@ SébastienGarcia-Roméo done =] –

1

две вещи:

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

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

2) Расширение примера Siamak A.Motlagh и добавление arr ([2] [4]) = 'Hi Mr.C'; присваивание не выполняется с помощью параметра «Неподключить TypeError: невозможно установить свойство 4« неопределенной »ошибки.

Смотрите 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, который ожидает массив дат, как и в объектах даты, который я расширил, чтобы использовать второй массив дат, чтобы содержать объекты даты, которые содержат время, поэтому я могу отслеживать несколько дат и несколько раз в день.

Спасибо.

3

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

//2d matrix in one line var 2darray = new Array(100).fill(null).map(()=>new Array(100).fill(null));

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

0

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

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

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

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

Смежные вопросы