Javascript двумерные массивы [дубликат]


На этот вопрос уже есть ответ здесь:

Я объявил двумерный массив, например:

a = [[]]

Однако, когда я пытаюсь дать значение второго измерения, используя индекс первого измерения, отличный от 0, это не работает:

a[1][0] = "foo" //returns error

Есть ли лучший способ вокруг этого, чем вручную определять каждый индекс, который вам нужен как массив, т. е.:

a[1] = [];
a[2] = [];
a[3] = [];
//et cetera
6 2

6 ответов:

N-мерные массивы не существуют в javascript - вы должны просто сделать массивы, содержащие массивы в качестве элементов.

Вы получаете ошибку, потому что a = [[]]; объявляет массив с одним элементом, который также является массивом. Поэтому a[0] является внутренним массивом, но a[1] не существует, потому что вы никогда его не объявляли. Самый простой способ правильно объявить "двумерный массив" - это использовать цикл:

var outerArray = [];
var numInternalArrays = 5;
for (var i = 0; i < numInternalArrays; i++) {
    outerArray[i] = [];
}

Если вы знаете, сколько элементов должен иметь корневой массив, вы можете сделать что-то вроде этого:

var arr = 
    (Math.pow(2,10)-1).toString(2)  // Binary string of 1s. Its length being 10
    .split('')                      // Create an array from this string
    .map(function(){return [];});   // Map a new empty array to each index

console.log(arr);                   // [[],[],[],[],[],[],[],[],[],[]]

Этим достигается то же самое:

for(var arr = [], i=10; i--; arr[i]=[]);

Нет необходимости объявлять arr вне цикла for, так как javascript не имеет области блока, он будет добавлен в область, в которой он выполняется.

a = [[]]

Это массив, причем первым элементом является массив. Именно поэтому индексация в первый элемент все еще работает (a[0][0]).

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

a = [[],[]]

Смотрите этот вопрос для примеров Как создать двумерный массив в JavaScript?

Если я правильно понял, используйте цикл:

for (var i = y; i--; a[i] = []);

В javascript нет многомерных массивов.
То, что вы делаете, - это массив массивов, но самый внешний массив имеет только один элемент (т. е. элемент 0), значение которого является другим массивом. Таким образом, a[1] (или, более широко, a[1][x]) является недопустимым, поскольку внешний массив имеет только один элемент.
Таким образом, вы можете сделать[0][x] = "foo", но не наоборот.

Таким образом, вы можете либо инициализировать массив с помощью цикла for, либо сделать что-то вроде var a =[[][][][][]];

Массив массивов можно запустить следующим образом:

var a = []; // start with the column array

Затем, когда вы хотите поместить что-то в местоположение [i][j], мы можем назвать " i "индексом строки и" j " индексом столбца.

if (!a[i]) {   // check for row existing
    a[i] = []; // .. and create it if not 
}
a[i][j] = 'foo'; // put something in the array cell
Обратите внимание, что это работает только потому, что мы всегда помещаем что-то в новый массив строк сразу после его создания. Это может не сработать, если вы поставите 0 или "" вместо "foo".

В javascript есть много вещей, которые являются "ложными", включая "null" и "undefined" и "0", и я просто не знаю, если пустой массив или массив с одним элементом, который является пустой строкой, считаются ложными. Так что вам придется поэкспериментировать с тем, как именно обнаружить недостающий массив строк, чтобы вы могли его добавить.