Como posso criar uma matriz bidimensional em JavaScript?


1136

Eu tenho lido online e alguns lugares dizem que não é possível, alguns dizem que é e depois dão um exemplo e outros refutam o exemplo, etc.

  1. Como declaro uma matriz bidimensional em JavaScript? (supondo que seja possível)

  2. Como eu acessaria seus membros? ( myArray[0][1]ou myArray[0,1]?)


21
Assumindo uma definição um tanto pedante, é tecnicamente impossível criar uma matriz 2D em javascript. Mas você pode criar uma matriz de matrizes, que é igual à mesma.
IJ Kennedy 29/07

10
Para sua informação ... quando você preencher uma matriz com mais matrizes usando var arr2D = new Array(5).fill(new Array(3));, cada elemento da Matriz (5) apontará para a mesma Matriz (3). Portanto, é melhor usar um loop for para preencher dinamicamente sub-matrizes.
Josh Stribling

51
a = Array(5).fill(0).map(x => Array(10).fill(0))
Longfei Wu 25/03

2
Em outras palavras, fillnão chama new Array(3)para cada índice da matriz que está sendo preenchida, já que não é uma expressão lambda ou qualquer coisa, como o comentário de Longfei Wu acima, que inicialmente preenche a matriz com zeros, depois usa a função de mapa com uma lambda para preencha cada elemento com uma nova matriz. A função de preenchimento simplesmente preenche a matriz exatamente com o que você deseja. Isso faz sentido? Para obter mais informações sobre a mapfunção, consulte: developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
Josh Stribling

2
@kalehmann que é bom: meta.stackoverflow.com/a/252017/2311074 If the new question is a better question or has better answers, then vote to close the old one as a duplicate of the new one.
Adam

Respostas:


1231

var items = [
  [1, 2],
  [3, 4],
  [5, 6]
];
console.log(items[0][0]); // 1
console.log(items[0][1]); // 2
console.log(items[1][0]); // 3
console.log(items[1][1]); // 4
console.log(items);


32
Seria difícil inicializar uma grande matriz multidimensional dessa maneira. No entanto, esta função pode ser usada para criar uma multidimensional vazia, com as dimensões especificadas como parâmetros.
Anderson Green

2
@AndersonGreen É uma coisa boa que você mencionou um link para os interessados em solução array multi-D, mas a pergunta ea resposta de Ballsacian1 está prestes série "2D", não "multi-D" array
evilReiko

Você deve passar pela coisa toda ... por exemplo, alerta (itens [0] [1]); // 2 etc.
Dois

1
@SashikaXP, isso não funciona para os primeiros índices diferentes de 0. #
Michael Franzl

1
A questão é como declarar uma matriz bidimensional. Foi o que eu estava procurando e encontrei as respostas a seguir e que não conseguem discernir a diferença entre declarar e inicializar. Também existe uma declaração com tamanho conhecido ou ilimitado, nenhum dos quais é discutido.
Chris

444

Você simplesmente transforma cada item da matriz em uma matriz.

var x = new Array(10);

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

console.log(x);


6
Eles podem usar coisas como strings para suas chaves e valores? myArray ['Livro'] ['item1']?
Diego

42
@ Diego, sim, mas não é para isso que as matrizes se destinam. É melhor usar um objeto quando suas chaves são cadeias de caracteres.
Matthew Crumley

10
Gosto mais deste exemplo do que a resposta aceita, porque isso pode ser implementado para matrizes de tamanho dinâmico, por exemplo, new Array(size)onde sizeé uma variável.
Variadicism

1
não funciona - erro na atribuição. Como essa resposta obteve 280 curtidas se é inútil?
Gargo 15/09/16

1
Isso está funcionando, obrigado. Você pode ver o exemplo Gargo jsfiddle.net/matasoy/oetw73sj
matasoy 23/09/16

198

Semelhante à resposta da ativa, aqui está uma função para criar uma matriz n-dimensional:

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)]

2
Isso pode criar uma matriz de 4 dimensões?
Trusktr 19/05/11

4
@trusktr: Sim, você pode criar quantas dimensões quiser (dentro das restrições de memória). Basta passar no comprimento das quatro dimensões. Por exemplo var array = createArray(2, 3, 4, 5);,.
Matthew Crumley

4
Melhor resposta ! No entanto, eu não recomendo usá-lo com 0 ou 1 parâmetros (inútil)
Apolo

2
@BritishDeveloper Sim. Esta é uma matriz 5D com cada comprimento de 5:[[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]],[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]]]
haykam

2
@haykam desculpe desperdiçar seu tempo - eu estava sendo sarcástico: /
BritishDeveloper

84

O Javascript possui apenas matrizes unidimensionais, mas você pode criar matrizes, como outros apontaram.

A seguinte função pode ser usada para construir uma matriz bidimensional de dimensões fixas:

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

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

  return arr;
}

O número de colunas não é realmente importante, porque não é necessário especificar o tamanho de uma matriz antes de usá-la.

Depois, basta ligar para:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...

Eu quero fazer uma matriz de 2-dim que representaria um baralho de cartas. O que seria uma matriz de 2 dim que detém o valor do cartão e depois o naipe. Qual seria a maneira mais fácil de fazer isso.
Doug Hauf

1
função Create2DArray (linhas) {var arr = []; for (var i = 0; i <linhas; i ++) {arr [i] = []; } retornar arr; } função print (deck) {for (t = 1; t <= 4; t ++) {for (i = 1; i <= 13; i ++) {document.writeln (deck [t] [i]); }}} função fillDeck (d) {for (t = 1; t <= 4; t ++) {myCardDeck [t] [1] = t; for (i = 1; i <= 13; i ++) {myCardDeck [t] [i] = i; }}} função loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); imprimir (myCardDeck); }
Doug Hauf 03/03

2
@ Doug: Você realmente quer uma matriz unidimensional de objetos com 2 atributos. var deck = []; baralho [0] = {face: 1, naipe: 'H'};
TeasingDart

@DougHauf que é uma matriz 2D reduzida? : P: D
Mahi

78

O jeito mais fácil:

var myArray = [[]];

29
que é uma matriz bidimensional
Maurizio Na dinamarca

15
Sim, cuidado com isso. Atribuir myArray [0] [o que quer que seja] está bem, mas tente definir myArray [1] [que seja] e reclama que o myArray [1] está indefinido.
Philip

22
@Philip você tem que definir myArray[1]=[];antes de atribuirmyArray[1][0]=5;
182764125216

4
Esteja ciente de que isso não "cria uma matriz 1x1 vazia", ​​como @AndersonGreen escreveu. Ele cria uma matriz "1x0" (ou seja, 1 linha contendo uma matriz com 0 colunas). myArray.length == 1e myArray[0].length == 0. O que gera o resultado errado se você copiar uma matriz "genuinamente vazia" "0x0" para ela.
JonBrave

3
@ 182764125216 que era o conhecimento do dia para mim. Obrigado :)
th3pirat3

76

Como criar uma matriz bidimensional vazia (uma linha)

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

2 e 4 sendo primeira e segunda dimensões, respectivamente.

Estamos usando Array.from, o que pode levar um parâmetro do tipo matriz e um mapeamento opcional para cada um dos elementos.

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

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

O mesmo truque pode ser usado para criar uma matriz JavaScript contendo 1 ... N


Alternativamente (mas 12% mais ineficiente com n = 10,000)

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

A diminuição do desempenho vem com o fato de que precisamos ter os primeiros valores de dimensão inicializados para execução .map. Lembre-se de que Arraynão alocará as posições até que você as solicite através da .fillatribuição direta ou de valor.

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


Acompanhamento

Aqui está um método que parece correto, mas tem problemas .

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

Embora retorne a matriz bidimensional aparentemente desejada ( [ [ <4 empty items> ], [ <4 empty items> ] ]), existe um problema: as matrizes da primeira dimensão foram copiadas por referência. Isso significa que um arr[0][0] = 'foo'realmente mudaria duas linhas em vez de uma.

var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);


Sugiro o seguinte:Array.from({length:5}, () => [])
vsync

Subjetiva aqui, mas esta resposta (a primeira e a segunda dentro dela) parece ser o melhor equilíbrio entre sucinto, rápido e moderno.
Brady Dowling

@zurfyx alguma idéia, ou alguém sabe, por que a tempestade na web está reclamando disso? Parece array.from mantém deixando valores como indefinido e, em seguida, eu não posso trabalhar com a matriz criada, embora o trecho funciona muito bem aqui no stackoverflow
FaultyJuggler

46

A razão pela qual alguns dizem que isso não é possível é porque uma matriz bidimensional é realmente apenas uma matriz de matrizes. Os outros comentários aqui fornecem métodos perfeitamente válidos para a criação de matrizes bidimensionais em JavaScript, mas o ponto de vista mais puro seria o fato de você ter uma matriz unidimensional de objetos, cada um desses objetos seria uma matriz unidimensional composta por dois elementos.

Então, essa é a causa dos pontos de vista conflitantes.


41
Não, não é. Em alguns idiomas, você pode ter matrizes multidimensionais como string[3,5] = "foo";. É uma abordagem melhor para alguns cenários, porque o eixo Y não é realmente um filho do eixo X.
Rafael Soares

3
Quando chega ao código de máquina subjacente, todos os tensores de dimensão> 1 são matrizes de matrizes, qualquer que seja o idioma de que falamos. Vale a pena ter isso em mente por motivos de otimização de cache. Qualquer linguagem decente que atenda seriamente à computação numérica permitirá que você alinhe sua estrutura multidimensional na memória, de modo que sua dimensão mais usada seja armazenada de forma contígua. Numpy do Python, Fortran e C, vêm à mente. De fato, há casos em que vale a pena reduzir a dimensionalidade em múltiplas estruturas por esse motivo.
Thomas Browne

Os computadores não têm noção de dimensões. Existe apenas uma dimensão, o endereço da memória. Tudo o resto é decoração notacional para o benefício do programador.
TeasingDart 18/09/2015

3
@ThomasBrowne Não exatamente. "Matrizes de matrizes" requerem algum armazenamento para os tamanhos de matrizes internas (elas podem diferir) e outra desreferenciação de ponteiro para encontrar o local onde uma matriz interna está armazenada. Em qualquer linguagem "decente", as matrizes multidimensionais diferem das matrizes irregulares, porque são estruturas de dados diferentes por si só. (E a parte confusa é que as matrizes C são multidimensionais, apesar de serem indexadas com a sintaxe [a] [b].)
polkovnikov.ph

33

Poucas pessoas mostram o uso de push:
Para trazer algo novo, mostrarei como inicializar a matriz com algum valor, por exemplo: 0 ou uma string vazia "".
Lembrando que se você tiver uma matriz de 10 elementos, em javascript o último índice será 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;
}

exemplos de uso:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0

Eu removo last for(que define o valor padrão) do seu procedimento e escreve m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));- e obtemos uma matriz muito strage (muito aninhada) - você a repara na última etapa for-defaultValue, mas acho que você pode reescrever o procedimento para usar menos aninhada antes definindo valores padrão.
Kamil Kiełczewski 21/01

27

Dois revestimentos:

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

Ele irá gerar uma matriz de comprimento 10, preenchida com matrizes. (O push adiciona um elemento a uma matriz e retorna o novo comprimento)


13
One-liner for (var a=[]; a.push([])<10;);:?
Bergi 07/07

@ Bergi a variável a ainda será definida na próxima linha ..?
StinkyCat

1
@StinkyCat: Sim, é assim que varfunciona. Sempre tem escopo de função.
Bergi

Eu sei, portanto, a sua one-liner é inútil neste caso: você não pode "acessar seus membros" (pergunta de verificação)
StinkyCat

1
domenukk e @Bergi, ambos estão corretos. Eu tentei e posso acessar um após o para. Peço desculpas! e obrigado, pode isto ser uma lição para mim;)
StinkyCat

24

A resposta mais sensata parece ser

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);


Observe que não podemos preencher diretamente com as linhas, pois o preenchimento usa o construtor de cópia superficial, portanto, todas as linhas compartilhariam a mesma memória ... aqui está um exemplo que demonstra como cada linha seria compartilhada (extraída de outras respostas):

// 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);

Isso deve estar no topo. Eu fiz algo semelhante usando, Array.apply(null, Array(nrows))mas isso é muito mais elegante.
dimiguel

A este respeito, meu último comentário ... O Internet Explorer e o Opera não têm suporte fill. Isso não funcionará na maioria dos navegadores.
27516 Dimiguel

@dimgl O preenchimento pode ser emulado nesta instância com um mapa constante:, Array(nrows).map(() => 0)ou,Array(nrows).map(function(){ return 0; });
Conor O'Brien

20

O jeito mais fácil:

var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'

18

Isto é o que eu consegui:

var appVar = [[]];
appVar[0][4] = "bineesh";
appVar[0][5] = "kumar";
console.log(appVar[0][4] + appVar[0][5]);
console.log(appVar);

Isso me soletrou bineeshkumar


2
Observe como você pode acessar apenas o índice 0 da matriz pai. Isso não é tão útil quanto algo que permite definir, por exemplo, appVar [5] [9] = 10; ... você obteria 'Não é possível definir a propriedade "9" de indefinida "com isso.
RaisinBranCrunch

Mas appVar[1][4] = "bineesh";está errado, como resolvê-lo?
Gank 20/05/19

16

Matrizes bidimensionais são criadas da mesma maneira que matrizes unidimensionais. E você acessa-os como array[0][1].

var arr = [1, 2, [3, 4], 5];

alert (arr[2][1]); //alerts "4"

14

Não sei se alguém respondeu isso, mas achei que funcionou muito bem para mim -

var array = [[,],[,]]

por exemplo:

var a = [[1,2],[3,4]]

Para uma matriz bidimensional, por exemplo.


Como posso fazer isso dinamicamente? Eu quero as matrizes internas com tamanhos diferentes.
alap

3
Você não precisa de vírgulas extras, var array = [[],[]]é adequado.
Kaya Toast

13

Para criar uma matriz 2D em javaScript, primeiro podemos criar uma matriz e, em seguida, adicionar matrizes como elementos. Este método retornará uma matriz 2D com o número especificado de linhas e colunas.

function Create2DArray(rows,columns) {
   var x = new Array(rows);
   for (var i = 0; i < rows; i++) {
       x[i] = new Array(columns);
   }
   return x;
}

Para criar uma matriz, use este método como abaixo.

var array = Create2DArray(10,20);

2
Por favor, adicione algumas informações explicativas ao seu ansdwer mostrando como ele funciona e por que ele resolve o problema. Isso ajudará outras pessoas que encontrarem esta página no futuro
Nosso Homem nas Bananas

Quando você precisaria de uma matriz pré-inicializada com um certo número de colunas em Javascript? Você também pode acessar o n-ésimo elemento de uma matriz [].
22414 domenukk

Notei que a função começa com C maiúsculo, o que (por certas convenções) sugere que seria um construtor Function e você a usaria com a nova palavra-chave. Um muito menor e um tanto opinativo, talvez, mas eu ainda sugeriria uma palavra não maiúscula.
Hachi

12

Para criar uma matriz "2D" não esparsa (x, y) com todos os índices endereçáveis ​​e valores definidos como nulos:

let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 

Matriz "3D" de bônus (x, y, z)

let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))

Variações e correções sobre isso foram mencionadas nos comentários e em vários pontos em resposta a esta pergunta, mas não como uma resposta real, por isso estou adicionando aqui.

Deve-se notar que (semelhante à maioria das outras respostas) isso tem complexidade de tempo O (x * y), portanto, provavelmente não é adequado para matrizes muito grandes.


1
tenha cuidado porque filldefina o mesmo valor. se a mudança nullpara `objecto que vai ser o mesmo objecto em cada coluna
Stanislav Mayorov

@StanislavMayorov Se você quiser definir o valor de cada célula, use o mesmo truque:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam

10

Usar compreensões de matriz

No JavaScript 1.7 e superior, você pode usar a compreensão de matrizes para criar matrizes bidimensionais. Você também pode filtrar e / ou manipular as entradas enquanto preenche a matriz e não precisa usar loops.

var rows = [1, 2, 3];
var cols = ["a", "b", "c", "d"];

var grid = [ for (r of rows) [ for (c of cols) r+c ] ];

/* 
         grid = [
            ["1a","1b","1c","1d"],
            ["2a","2b","2c","2d"],
            ["3a","3b","3c","3d"]
         ]
*/

Você pode criar qualquer n x mmatriz que desejar e preenchê-la com um valor padrão chamando

var default = 0;  // your 2d array will be filled with this value
var n_dim = 2;
var m_dim = 7; 

var arr = [ for (n of Array(n_dim)) [ for (m of Array(m_dim) default ]] 
/* 
         arr = [
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
         ]
*/

Mais exemplos e documentação podem ser encontrados aqui .

Observe que esse ainda não é um recurso padrão .


Uma verificação rápida no google aqui ... sim ... a forafirmação ainda é um loop ...
Pimp Trizkit

1
Não é suportado por nenhum navegador - AQUI ?
Kamil Kiełczewski 21/01

10

Para os amantes de uma linha Array.from ()

// creates 8x8 array filed with "0"    
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"))

Outro (do comentário de dmitry_romanov) usa Array (). Fill ()

// creates 8x8 array filed with "0"    
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"))

Usando o operador de spread ES6 + ("inspirado" pela resposta InspiredJW :))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))

2
podemos remover 0na primeira fill()função:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li

8

Minha abordagem é muito semelhante à resposta do @Bineesh, mas com uma abordagem mais geral.

Você pode declarar a matriz dupla da seguinte maneira:

var myDoubleArray = [[]];

E o armazenamento e acesso ao conteúdo da seguinte maneira:

var testArray1 = [9,8]
var testArray2 = [3,5,7,9,10]
var testArray3 = {"test":123}
var index = 0;

myDoubleArray[index++] = testArray1;
myDoubleArray[index++] = testArray2;
myDoubleArray[index++] = testArray3;

console.log(myDoubleArray[0],myDoubleArray[1][3], myDoubleArray[2]['test'],) 

Isso imprimirá a saída esperada

[ 9, 8 ] 9 123

8

atuação

Hoje em 2020.02.05, realizo testes no MacOs HighSierra 10.13.6 no Chrome v79.0, Safari v13.0.4 e Firefox v72.0, para soluções escolhidas.

Conclusões para uma matriz 2D não inicializada

  • solução esotérica {}/arr[[i,j]] (N) é mais rápida para matrizes grandes e pequenas e parece ser uma boa escolha para matrizes esparsas grandes
  • soluções baseadas em for-[]/while (A, G) são rápidas e são uma boa opção para pequenas matrizes.
  • soluções for-[] (B, C) são rápidas e são uma boa opção para grandes matrizes
  • soluções baseadas em Array..map/from/fill (I, J, K, L, M) são bastante lentas para pequenas matrizes e bastante rápidas para grandes matrizes
  • surpreendentemente for-Array(n)(B, C) é muito mais lento no safari que for-[](A)
  • surpreendentemente for-[](A) para grande variedade é lento em todos os navegadores
  • soluções K é lenta para pequenas matrizes para todos os navegadores
  • As soluções A, E, G são lentas para grandes matrizes para todos os navegadores
  • solução M é a mais lenta para todas as matrizes em todos os navegadores

insira a descrição da imagem aqui

Conclusões para a matriz 2D inicializada

  • as soluções baseadas em for/while(A, B, C, D, E, G) são mais rápidas / rápidas para pequenas matrizes em todos os navegadores
  • as soluções baseadas em for(A, B, C, E) são mais rápidas / rápidas para grandes matrizes em todos os navegadores
  • As soluções baseadas em Array..map/from/fill(I, J, K, L, M) são médias ou rápidas ou lentas para pequenas matrizes em todos os navegadores
  • As soluções F, G, H, I, J, K, L para grandes matrizes são médias ou rápidas no chrome e safari, mas mais lentas no firefox.
  • solução esotérica {}/arr[[i,j]](N) é mais lenta para matrizes pequenas e grandes em todos os navegadores

insira a descrição da imagem aqui

Detalhes

Teste de soluções que não preenchem (inicializam) a matriz de saída

Testamos a velocidade das soluções para

  • matrizes pequenas (12 elementos) - você pode executar testes em sua máquina AQUI
  • matrizes grandes (1 milhão de elementos) matrizes - você pode realizar testes em sua máquina AQUI

Teste de soluções que preenchem (inicializam) a matriz de saída

Testamos a velocidade das soluções para

  • matrizes pequenas (12 elementos) - você pode executar testes em sua máquina AQUI
  • matrizes grandes (1 milhão de elementos) matrizes - você pode realizar testes em sua máquina AQUI

insira a descrição da imagem aqui


7

Eu encontrei abaixo é a maneira mais simples:

var array1 = [[]];   
array1[0][100] = 5; 

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);

array1[1][100] = 666;jogaUncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski 21/01

@ KamilKiełczewski você está certo, parece que isso é iniciado apenas para a primeira matriz de matriz; pela segunda antes de você array1[1][100] = 666;, é necessário fazer isso array1[1] = [];.
GMsoF 22/01

6

O Javascript não suporta matrizes bidimensionais; em vez disso, armazenamos uma matriz dentro de outra matriz e buscamos os dados dessa matriz, dependendo da posição da matriz que você deseja acessar. Lembre-se de que a numeração da matriz começa em ZERO .

Exemplo de código:

/* Two dimensional array that's 5 x 5 

       C0 C1 C2 C3 C4 
    R0[1][1][1][1][1] 
    R1[1][1][1][1][1] 
    R2[1][1][1][1][1] 
    R3[1][1][1][1][1] 
    R4[1][1][1][1][1] 
*/

var row0 = [1,1,1,1,1],
    row1 = [1,1,1,1,1],
    row2 = [1,1,1,1,1],
    row3 = [1,1,1,1,1],
    row4 = [1,1,1,1,1];

var table = [row0,row1,row2,row3,row4];
console.log(table[0][0]); // Get the first item in the array

6

var playList = [
  ['I Did It My Way', 'Frank Sinatra'],
  ['Respect', 'Aretha Franklin'],
  ['Imagine', 'John Lennon'],
  ['Born to Run', 'Bruce Springsteen'],
  ['Louie Louie', 'The Kingsmen'],
  ['Maybellene', 'Chuck Berry']
];

function print(message) {
  document.write(message);
}

function printSongs( songs ) {
  var listHTML;
  listHTML = '<ol>';
  for ( var i = 0; i < songs.length; i += 1) {
    listHTML += '<li>' + songs[i][0] + ' by ' + songs[i][1] + '</li>';
  }
  listHTML += '</ol>';
  print(listHTML);
}

printSongs(playList);


6

ES6 +, ES2015 + pode fazer isso de maneira ainda mais simples


Criando matriz 3 x 2 preenchida com true

[...Array(3)].map(item => Array(2).fill(true))

Eu preciso confessar. Eu "adotei" sua resposta e adicionei à minha , a coleção one-liners.
meu-

5

Eu tive que criar uma função de matriz flexível para adicionar "registros" a ele conforme necessário e poder atualizá-los e fazer os cálculos necessários antes de enviá-lo para um banco de dados para processamento adicional. Aqui está o código, espero que ajude :).

function Add2List(clmn1, clmn2, clmn3) {
    aColumns.push(clmn1,clmn2,clmn3); // Creates array with "record"
    aLine.splice(aPos, 0,aColumns);  // Inserts new "record" at position aPos in main array
    aColumns = [];    // Resets temporary array
    aPos++ // Increments position not to overlap previous "records"
}

Sinta-se livre para otimizar e / ou apontar quaisquer erros :)


Que tal apenas aLine.push([clmn1, clmn2, clmn3]);?
Pimp Trizkit

5

Aqui está uma maneira rápida que encontrei de fazer uma matriz bidimensional.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(e => Array(y));
}

Você pode facilmente transformar essa função em uma função ES5 também.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(function(e) {
        return Array(y);
    });
}

Por que isso funciona: o new Array(n)construtor cria um objeto com um protótipo Array.prototypee depois atribui o objeto length, resultando em uma matriz não preenchida. Devido à falta de membros reais, não podemos executar oArray.prototype.map função nele.

No entanto, quando você fornece mais de um argumento ao construtor, como quando o faz Array(1, 2, 3, 4), o construtor usará o argumentsobjeto para instanciar e preencher umaArray objeto corretamente.

Por esse motivo, podemos usar Array.apply(null, Array(x)), porque a applyfunção espalhará os argumentos no construtor. Para esclarecimento, fazer Array.apply(null, Array(3))é equivalente a fazer Array(null, null, null).

Agora que criamos uma matriz preenchida real, tudo o que precisamos fazer é chamar mape criar a segunda camada ( y).


5

Abaixo de um, cria uma matriz 5x5 e preenche-os com null

var md = [];
for(var i=0; i<5; i++) {
    md.push(new Array(5).fill(null));
}

console.log(md);


3
Esta resposta está errada. Ele criará uma matriz com a mesma matriz preenchendo seus slots. md[1][0] = 3 e todo o resto dos elementos são muito atualizados
Qiang

5

Os tamanhos de linha e coluna de uma matriz conhecida apenas no tempo de execução e o método a seguir pode ser usado para criar uma matriz 2D dinâmica .

var num = '123456';
var row = 3; // Known at run time
var col = 2; // Known at run time
var i = 0;

var array2D = [[]];
for(var r = 0; r < row; ++r)
{
    array2D[r] = [];
    for(var c = 0; c < col; ++c)
    {
        array2D[r][c] = num[i++];
    }
}
console.log(array2D); 
// [[ '1', '2' ], 
//  [ '3', '4' ], 
//  [ '5', '6' ]]

console.log(array2D[2][1]); // 6

4

Existe outra solução, que não o força a pré-definir o tamanho da matriz 2d, e isso é muito conciso.

var table = {}
table[[1,2]] = 3 // Notice the double [[ and ]]
console.log(table[[1,2]]) // -> 3

Isso funciona porque, [1,2]é transformado em uma string, usada como uma chave de string para o tableobjeto.


Essa resposta sozinha me faz não querer mexer com as matrizes indesejadas que são "multidimensionais" em JavaScript, mesmo que eu tenha uma solução muito elegante. Isso também ilustra que todo mundo não está realmente criando matrizes multidimensionais. uma "matriz" em JavaScript; esta resposta "simulará" completamente uma matriz de dimensão infinita e tamanho pseudo-infinito, de tamanhos e conteúdos arbitrários.Todas as outras respostas baseadas em recursão e loop têm um limite superior muito mais baixo ao tamanho da estrutura da matriz que eles podem criar. E a criação a velocidade será uma questão importante para essas estruturas maiores.
Pimp Trizkit

Use esta linha para simular a pré-recheio:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit

Maneira agradável e criativa de 'emular' o Array2D por objeto :)
Kamil Kiełczewski 21/01

4

Para criar uma matriz 4x6, basta fazer isso

const x = [...Array(6)].map(elem => new Array(4))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.