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.
Como declaro uma matriz bidimensional em JavaScript? (supondo que seja possível)
Como eu acessaria seus membros? (
myArray[0][1]
oumyArray[0,1]
?)
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.a = Array(5).fill(0).map(x => Array(10).fill(0))
fill
não chamanew 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 amap
função, consulte: developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…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.
Respostas:
fonte
Você simplesmente transforma cada item da matriz em uma matriz.
fonte
new Array(size)
ondesize
é uma variável.Semelhante à resposta da ativa, aqui está uma função para criar uma matriz n-dimensional:
fonte
var array = createArray(2, 3, 4, 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]]]]]
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:
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:
fonte
O jeito mais fácil:
fonte
myArray[1]=[];
antes de atribuirmyArray[1][0]=5;
myArray.length == 1
emyArray[0].length == 0
. O que gera o resultado errado se você copiar uma matriz "genuinamente vazia" "0x0" para ela.Como criar uma matriz bidimensional vazia (uma linha)
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.O mesmo truque pode ser usado para criar uma matriz JavaScript contendo 1 ... N
Alternativamente (mas 12% mais ineficiente com
n = 10,000
)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 queArray
não alocará as posições até que você as solicite através da.fill
atribuição direta ou de valor.Acompanhamento
Aqui está um método que parece correto, mas tem problemas .
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 umarr[0][0] = 'foo'
realmente mudaria duas linhas em vez de uma.fonte
Array.from({length:5}, () => [])
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.
fonte
string[3,5] = "foo";
. É uma abordagem melhor para alguns cenários, porque o eixo Y não é realmente um filho do eixo X.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!
exemplos de uso:
fonte
for
(que define o valor padrão) do seu procedimento e escrevem=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.Dois revestimentos:
Ele irá gerar uma matriz de comprimento 10, preenchida com matrizes. (O push adiciona um elemento a uma matriz e retorna o novo comprimento)
fonte
for (var a=[]; a.push([])<10;);
:?var
funciona. Sempre tem escopo de função.A resposta mais sensata parece ser
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):
fonte
Array.apply(null, Array(nrows))
mas isso é muito mais elegante.fill
. Isso não funcionará na maioria dos navegadores.Array(nrows).map(() => 0)
ou,Array(nrows).map(function(){ return 0; });
O jeito mais fácil:
fonte
Isto é o que eu consegui:
Isso me soletrou bineeshkumar
fonte
appVar[1][4] = "bineesh";
está errado, como resolvê-lo?Matrizes bidimensionais são criadas da mesma maneira que matrizes unidimensionais. E você acessa-os como
array[0][1]
.fonte
Não sei se alguém respondeu isso, mas achei que funcionou muito bem para mim -
por exemplo:
Para uma matriz bidimensional, por exemplo.
fonte
var array = [[],[]]
é adequado.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.
Para criar uma matriz, use este método como abaixo.
fonte
Para criar uma matriz "2D" não esparsa (x, y) com todos os índices endereçáveis e valores definidos como nulos:
Matriz "3D" de bônus (x, y, z)
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.
fonte
fill
defina o mesmo valor. se a mudançanull
para `objecto que vai ser o mesmo objecto em cada colunalet 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
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.
Você pode criar qualquer
n x m
matriz que desejar e preenchê-la com um valor padrão chamandoMais exemplos e documentação podem ser encontrados aqui .
Observe que esse ainda não é um recurso padrão .
fonte
for
afirmação ainda é um loop ...Para os amantes de uma linha Array.from ()
Outro (do comentário de dmitry_romanov) usa Array (). Fill ()
Usando o operador de spread ES6 + ("inspirado" pela resposta InspiredJW :))
fonte
0
na primeirafill()
função:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Minha abordagem é muito semelhante à resposta do @Bineesh, mas com uma abordagem mais geral.
Você pode declarar a matriz dupla da seguinte maneira:
E o armazenamento e acesso ao conteúdo da seguinte maneira:
Isso imprimirá a saída esperada
fonte
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
{}/arr[[i,j]]
(N) é mais rápida para matrizes grandes e pequenas e parece ser uma boa escolha para matrizes esparsas grandesfor-[]/while
(A, G) são rápidas e são uma boa opção para pequenas matrizes.for-[]
(B, C) são rápidas e são uma boa opção para grandes matrizesArray..map/from/fill
(I, J, K, L, M) são bastante lentas para pequenas matrizes e bastante rápidas para grandes matrizesfor-Array(n)
(B, C) é muito mais lento no safari quefor-[]
(A)for-[]
(A) para grande variedade é lento em todos os navegadoresConclusões para a matriz 2D inicializada
for/while
(A, B, C, D, E, G) são mais rápidas / rápidas para pequenas matrizes em todos os navegadoresfor
(A, B, C, E) são mais rápidas / rápidas para grandes matrizes em todos os navegadoresArray..map/from/fill
(I, J, K, L, M) são médias ou rápidas ou lentas para pequenas matrizes em todos os navegadores{}/arr[[i,j]]
(N) é mais lenta para matrizes pequenas e grandes em todos os navegadoresDetalhes
Teste de soluções que não preenchem (inicializam) a matriz de saída
Testamos a velocidade das soluções para
Mostrar snippet de código
Teste de soluções que preenchem (inicializam) a matriz de saída
Testamos a velocidade das soluções para
Mostrar snippet de código
fonte
Eu encontrei abaixo é a maneira mais simples:
fonte
array1[1][100] = 666;
jogaUncaught TypeError: Cannot set property '100' of undefined
array1[1][100] = 666;
, é necessário fazer issoarray1[1] = [];
.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:
fonte
fonte
ES6 +, ES2015 + pode fazer isso de maneira ainda mais simples
Criando matriz 3 x 2 preenchida com true
fonte
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 :).
Sinta-se livre para otimizar e / ou apontar quaisquer erros :)
fonte
aLine.push([clmn1, clmn2, clmn3]);
?Aqui está uma maneira rápida que encontrei de fazer uma matriz bidimensional.
Você pode facilmente transformar essa função em uma função ES5 também.
Por que isso funciona: o
new Array(n)
construtor cria um objeto com um protótipoArray.prototype
e depois atribui o objetolength
, 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á oarguments
objeto para instanciar e preencher umaArray
objeto corretamente.Por esse motivo, podemos usar
Array.apply(null, Array(x))
, porque aapply
função espalhará os argumentos no construtor. Para esclarecimento, fazerArray.apply(null, Array(3))
é equivalente a fazerArray(null, null, null)
.Agora que criamos uma matriz preenchida real, tudo o que precisamos fazer é chamar
map
e criar a segunda camada (y
).fonte
Abaixo de um, cria uma matriz 5x5 e preenche-os com
null
fonte
md[1][0] = 3
e todo o resto dos elementos são muito atualizadosOs 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 .
fonte
Existe outra solução, que não o força a pré-definir o tamanho da matriz 2d, e isso é muito conciso.
Isso funciona porque,
[1,2]
é transformado em uma string, usada como uma chave de string para otable
objeto.fonte
var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Para criar uma matriz 4x6, basta fazer isso
fonte