¿Cómo puedo crear una matriz bidimensional en JavaScript?

1137

He estado leyendo en línea y algunos lugares dicen que no es posible, algunos lo dicen y luego dan un ejemplo y otros refutan el ejemplo, etc.

  1. ¿Cómo declaro una matriz bidimensional en JavaScript? (suponiendo que sea posible)

  2. ¿Cómo accedería a sus miembros? ( myArray[0][1]o myArray[0,1]?)

Diego
fuente
21
Suponiendo una definición algo pedante, es técnicamente imposible crear una matriz 2d en javascript. Pero puede crear una matriz de matrices, lo que equivale a lo mismo.
IJ Kennedy
10
FYI ... cuando llena una matriz con más matrices usando var arr2D = new Array(5).fill(new Array(3));, cada elemento de la matriz (5) apuntará a la misma matriz (3). Por lo tanto, es mejor usar un bucle for para llenar dinámicamente sub matrices.
Josh Stribling
51
a = Array(5).fill(0).map(x => Array(10).fill(0))
Longfei Wu
2
En otras palabras, fillno requiere que new Array(3)se llene cada índice de la matriz, ya que no es una expresión lambda ni nada, como el comentario de Longfei Wu anterior, que inicialmente llena la matriz con 0, luego usa la función de mapa con una lambda para llenar cada elemento con una nueva matriz. La función de relleno simplemente llena la matriz con exactamente lo que le dices. ¿Tiene sentido? Para obtener más información sobre la mapfunción, consulte: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Josh Stribling
2
@kalehmann eso está bien: 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

Respuestas:

1232

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

Ballsacian1
fuente
32
Sería difícil inicializar una gran matriz multidimensional de esta manera. Sin embargo, esta función se puede utilizar para crear un multidimensional vacío, con las dimensiones especificadas como parámetros.
Anderson Green
2
@AndersonGreen Es bueno que haya mencionado un enlace para aquellos interesados ​​en la solución de matriz multi-D, pero la pregunta y la respuesta de Ballsacian1 son sobre una matriz "2D", no una matriz "multi-D"
evilReiko
Debe revisar todo el asunto ... por ejemplo, alerta (elementos [0] [1]); // 2 etc.
Dois
1
@SashikaXP, esto no funciona para los primeros índices que no sean 0.
Michael Franzl
1
La pregunta es cómo declarar una matriz bidimensional. Que es lo que estaba buscando y encontré esto y las siguientes respuestas que no logran discernir la diferencia entre declarar e inicializar. También hay una declaración con longitud conocida o ilimitada, ninguna de las cuales se discute.
Chris
444

Simplemente convierte cada elemento dentro de la matriz en una matriz.

var x = new Array(10);

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

console.log(x);

Sufí
fuente
66
¿Pueden usar cosas como cadenas para sus claves y valores? myArray ['Libro'] ['item1']?
Diego
42
@Diego, sí, pero eso no es para lo que están destinadas las matrices. Es mejor usar un objeto cuando las teclas son cadenas.
Matthew Crumley
10
Me gusta este ejemplo mejor que la respuesta aceptada porque se puede implementar para matrices de tamaño dinámico, por ejemplo, new Array(size)donde sizees una variable.
Variadicismo
1
no funciona: error en la asignación. ¿Cómo obtuvo esta respuesta 280 Me gusta si es inútil?
Gargo
1
Esto está funcionando, gracias. Puedes ver el ejemplo Gargo jsfiddle.net/matasoy/oetw73sj
matasoy
198

Similar a la respuesta de activa, aquí hay una función para crear una 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)]
Matthew Crumley
fuente
2
¿Puede esto crear una matriz de 4 dimensiones?
trusktr
44
@trusktr: Sí, puede crear tantas dimensiones como desee (dentro de las limitaciones de su memoria). Simplemente pase la longitud de las cuatro dimensiones. Por ejemplo, var array = createArray(2, 3, 4, 5);.
Matthew Crumley
44
La mejor respuesta ! Sin embargo, no recomendaría usarlo con 0 o 1 parámetros (inútil)
Apolo
2
@BritishDeveloper Sí. Esta es una matriz 5D con cada longitud a 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 lamento perder el tiempo - Estaba siendo sarcástico: /
BritishDeveloper
84

Javascript solo tiene matrices unidimensionales, pero puede construir matrices de matrices, como otros señalaron.

La siguiente función se puede utilizar para construir una matriz 2-d de dimensiones fijas:

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

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

  return arr;
}

El número de columnas no es realmente importante, porque no es necesario especificar el tamaño de una matriz antes de usarlo.

Entonces puedes simplemente llamar:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...
Philippe Leybaert
fuente
Quiero hacer una matriz de 2 dim que represente una baraja de cartas. Lo que sería una matriz de 2 dim que contiene el valor de la tarjeta y luego en el palo. ¿Cuál sería la forma más fácil de hacer eso?
Doug Hauf
1
función Create2DArray (filas) {var arr = []; para (var i = 0; i <filas; i ++) {arr [i] = []; } return arr; } función print (deck) {for (t = 1; t <= 4; t ++) {for (i = 1; i <= 13; i ++) {document.writeln (deck [t] [i]); }}} fucntion fillDeck (d) {para (t = 1; t <= 4; t ++) {myCardDeck [t] [1] = t; para (i = 1; i <= 13; i ++) {myCardDeck [t] [i] = i; }}} función loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); print (myCardDeck); }
Doug Hauf
2
@Doug: en realidad quieres una matriz unidimensional de objetos con 2 atributos. var deck = []; mazo [0] = {cara: 1, palo: 'H'};
TeasingDart
@DougHauf que es una matriz 2D minimizada? : P: D
Mahi
78

La forma más fácil:

var myArray = [[]];
Fred
fuente
29
que es una matriz de 2 dimensiones
Maurizio En Dinamarca
15
Sí, cuidado con eso. Asignar myArray [0] [lo que sea] está bien, pero intente configurar myArray [1] [lo que sea] y se queja de que myArray [1] no está definido.
Philip
22
@Philip que debe configurar myArray[1]=[];antes de asignarmyArray[1][0]=5;
182764125216
44
Tenga en cuenta que esto no "crea una matriz 1x1 vacía" como escribió @AndersonGreen. Crea una matriz "1x0" (es decir, 1 fila que contiene una matriz con 0 columnas). myArray.length == 1y myArray[0].length == 0. Lo que luego da el resultado incorrecto si copia una matriz "0x0" "realmente vacía".
JonBrave
3
@ 182764125216 que fue el conocimiento del día para mí. Gracias :)
th3pirat3
76

Cómo crear una matriz bidimensional vacía (una línea)

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

2 y 4 son primera y segunda dimensiones respectivamente.

Estamos haciendo uso de Array.from, que puede tomar un parámetro similar a una matriz y una asignación opcional para cada uno de los elementos.

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

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

Se puede usar el mismo truco para crear una matriz de JavaScript que contenga 1 ... N


Alternativamente (pero más ineficiente 12% con n = 10,000)

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

La disminución del rendimiento viene con el hecho de que tenemos que tener los primeros valores de dimensión inicializados para ejecutarse .map. Recuerde que Arrayno asignará las posiciones hasta que lo ordene a través de .filluna asignación de valor directa o directa.

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


Seguimiento

Aquí hay un método que parece correcto, pero tiene problemas .

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

Si bien devuelve la matriz bidimensional aparentemente deseada ( [ [ <4 empty items> ], [ <4 empty items> ] ]), hay una captura: las matrices de primera dimensión se han copiado por referencia. Eso significa arr[0][0] = 'foo'que a realmente cambiaría dos filas en lugar de una.

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

zurfyx
fuente
Sugiero lo siguiente:Array.from({length:5}, () => [])
VSYNC
Subjetiva aquí, pero esta respuesta (la primera y la segunda dentro de ella) parece ser el mejor equilibrio entre sucinto, rápido y moderno.
Brady Dowling
@zurfyx alguna idea, o alguien sabe, ¿por qué Webstorm se queja de esto? Parece que array.from sigue dejando valores como indefinidos y luego no puedo trabajar con la matriz creada, a pesar de que el fragmento funciona bien aquí en stackoverflow
FaultyJuggler
46

La razón por la que algunos dicen que no es posible es porque una matriz bidimensional es realmente solo una matriz de matrices. Los otros comentarios aquí proporcionan métodos perfectamente válidos para crear matrices bidimensionales en JavaScript, pero el punto de vista más puro sería que tiene una matriz unidimensional de objetos, cada uno de esos objetos sería una matriz unidimensional que consta de dos elementos.

Entonces, esa es la causa de los puntos de vista en conflicto.

James Conigliaro
fuente
42
No, no es. En algunos idiomas, puede tener matrices multidimensionales como string[3,5] = "foo";. Es un mejor enfoque para algunos escenarios, porque el eje Y no es en realidad un hijo del eje X.
Rafael Soares el
3
Una vez que llega al código de máquina subyacente, todos los tensores de dimensión> 1 son matrices de matrices, de cualquier idioma del que estemos hablando. Vale la pena tener esto en cuenta por razones de optimización de caché. Cualquier lenguaje decente que atienda seriamente a la computación numérica le permitirá alinear su estructura multidimensional en la memoria de modo que su dimensión más utilizada se almacene de manera contigua. Me vienen a la mente Numpy, Fortran y C de Python. De hecho, hay casos en los que vale la pena reducir la dimensionalidad en múltiples estructuras por este motivo.
Thomas Browne
Las computadoras no tienen noción de dimensiones. Solo hay 1 dimensión, la dirección de memoria. Todo lo demás es decoración de notación para el beneficio del programador.
TeasingDart
3
@ThomasBrowne No exactamente. Las "matrices de matrices" requieren algo de almacenamiento para los tamaños de las matrices internas (pueden diferir) y otra referencia de puntero para encontrar el lugar donde se almacena una matriz interna. En cualquier lenguaje "decente", las matrices multidimensionales difieren de las matrices irregulares, porque son estructuras de datos diferentes per se. (Y la parte C confuso es que las matrices son multidimensional, a pesar de que están indexados con [a] Sintaxis [b].)
polkovnikov.ph
33

Pocas personas muestran el uso de push:
para traer algo nuevo, le mostraré cómo inicializar la matriz con algún valor, por ejemplo: 0 o una cadena vacía "".
Recordando que si tiene una matriz de 10 elementos, ¡en JavaScript el ú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;
}

ejemplos 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
Sergio Abreu
fuente
Elimino el último for(que establece el valor predeterminado) de su procedimiento y escribo m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));, y obtenemos una matriz muy extraña (demasiado anidada), lo repara en el último paso de valor predeterminado, pero creo que puede volver a escribir el procedimiento para usar arras menos anidados antes establecer valores predeterminados.
Kamil Kiełczewski
27

Dos líneas:

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

Generará una matriz a de la longitud 10, llena de matrices. (Push agrega un elemento a una matriz y devuelve la nueva longitud)

Domenukk
fuente
13
One-liner for (var a=[]; a.push([])<10;);:?
Bergi
@ Bergi, ¿se definirá la variable a en la siguiente línea?
StinkyCat
1
@StinkyCat: Sí, así es como varfunciona. Siempre tiene un alcance funcional.
Bergi
Lo sé, por lo tanto, su frase es inútil en este caso: no puede "acceder a sus miembros" (consulte la pregunta)
StinkyCat
1
Domenukk y @ Bergi, ambos tienen razón. Lo probé y puedo acceder a un después. ¡Me disculpo! y gracias, que esto sea una lección para mí;)
StinkyCat
24

La respuesta más 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);


Tenga en cuenta que no podemos llenar directamente con las filas ya que el relleno usa un constructor de copia superficial, por lo tanto, todas las filas compartirían la misma memoria ... aquí hay un ejemplo que demuestra cómo se compartiría cada fila (tomada de otras respuestas):

// 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);
Francesco Dondi
fuente
Esto debería estar en la parte superior. Hice algo similar usando Array.apply(null, Array(nrows))pero esto es mucho más elegante.
dimiguel
Este es mi último comentario ... Internet Explorer y Opera no tienen soporte para fill. Esto no funcionará en la mayoría de los navegadores.
dimiguel
@dimgl Fill se puede emular en este caso con un mapa constante: Array(nrows).map(() => 0) o,Array(nrows).map(function(){ return 0; });
Conor O'Brien
20

La forma más 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'
Chicharito
fuente
18

Esto es lo que logré:

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

Esto me deletreó bineeshkumar

Bineesh
fuente
2
Observe cómo solo puede acceder al índice 0 de la matriz principal. Esto no es tan útil como algo que le permite configurar, por ejemplo, appVar [5] [9] = 10; ... obtendría 'No se puede establecer la propiedad "9" de indefinido' con esto.
RaisinBranCrunch
Pero appVar[1][4] = "bineesh";está mal, ¿cómo resolverlo?
Gank
16

Las matrices bidimensionales se crean de la misma manera que las matrices unidimensionales. Y accedes a ellos como array[0][1].

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

alert (arr[2][1]); //alerts "4"
TJ L
fuente
14

No estoy seguro de si alguien ha respondido esto, pero descubrí que esto me funcionó bastante bien.

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

p.ej:

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

Para una matriz bidimensional, por ejemplo.

Uchenna
fuente
¿Cómo puedo hacer esto dinámicamente? Quiero las matrices internas con diferentes tamaños.
alap
3
No necesitas comas adicionales var array = [[],[]]es adecuado.
Kaya Toast
13

Para crear una matriz 2D en javaScript, primero podemos crear una matriz y luego agregar matrices como elementos. Este método devolverá una matriz 2D con el número dado de filas y columnas.

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

Para crear una matriz, utilice este método como se muestra a continuación.

var array = Create2DArray(10,20);
principal
fuente
2
¿Podría agregar información explicativa a su respuesta que muestre cómo funciona y por qué resuelve el problema? Esto ayudará a otros que encuentren esta página en el futuro
Our Man in Bananas
¿Cuándo necesitaría una matriz preinicializada con un cierto número de columnas en Javascript? También puede acceder al elemento n-ésimo de una matriz [].
domenukk
Noté que la función comienza con C mayúscula, que (según ciertas convenciones) sugiere que sería un constructor de funciones y que lo usaría con la nueva palabra clave. Tal vez una muy pequeña y algo obstinada, pero aún sugeriría una palabra sin mayúscula.
Hachi
12

Para crear una matriz "2D" no dispersa (x, y) con todos los índices direccionables y valores establecidos en nulo:

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

Matriz "3D" de bonificación (x, y, z)

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

Se han mencionado variaciones y correcciones sobre esto en los comentarios y en varios puntos en respuesta a esta pregunta, pero no como una respuesta real, así que lo estoy agregando aquí.

Cabe señalar que (similar a la mayoría de las otras respuestas) tiene una complejidad de tiempo O (x * y), por lo que probablemente no sea adecuado para matrices muy grandes.

Justin Ohms
fuente
1
tenga cuidado porque fillestablezca el mismo valor. si cambia nulla `object, será el mismo objeto en cada columna
Stanislav Mayorov
@StanislavMayorov Si desea establecer el valor de cada celda, simplemente use el mismo truco:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam
10

Usar comprensiones de matriz

En JavaScript 1.7 y superior, puede utilizar las comprensiones de matriz para crear matrices bidimensionales. También puede filtrar y / o manipular las entradas mientras llena la matriz y no tiene que usar bucles.

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"]
         ]
*/

Puede crear cualquier n x mmatriz que desee y llenarla con un valor predeterminado llamando

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],
         ]
*/

Más ejemplos y documentación se pueden encontrar aquí .

Tenga en cuenta que esta no es una característica estándar todavía .

Tim Hallyburton
fuente
Un rápido chequeo de Google aquí ... sí ... la fordeclaración sigue siendo un bucle ...
Pimp Trizkit
1
No es compatible con ningún navegador, ¿ AQUÍ ?
Kamil Kiełczewski
10

Para los amantes de una línea Array.from ()

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

Otro (del comentario de dmitry_romanov) usa Array (). Fill ()

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

Uso del operador de propagación ES6 + ("inspirado" por la respuesta de InspiredJW :))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))
mi-
fuente
2
podemos eliminar 0en la primera fill()función:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li
8

Mi enfoque es muy similar a la respuesta @Bineesh pero con un enfoque más general.

Puede declarar la matriz doble de la siguiente manera:

var myDoubleArray = [[]];

Y el almacenamiento y acceso a los contenidos de la siguiente manera:

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

Esto imprimirá el resultado esperado

[ 9, 8 ] 9 123
Alejandro
fuente
8

Actuación

Hoy 2020.02.05 realizo pruebas en MacOs HighSierra 10.13.6 en Chrome v79.0, Safari v13.0.4 y Firefox v72.0, para las soluciones elegidas.

Conclusiones para la matriz 2d no inicializada

  • La solución esotérica {}/arr[[i,j]](N) es la más rápida para matrices grandes y pequeñas y parece que es una buena opción para matrices dispersas grandes
  • Las soluciones basadas en for-[]/while(A, G) son rápidas y son una buena opción para arreglos pequeños.
  • Las soluciones for-[](B, C) son rápidas y son una buena opción para grandes matrices
  • soluciones basadas en Array..map/from/fill (I, J, K, L, M) son bastante lentas para matrices pequeñas y bastante rápidas para matrices grandes
  • Sorprendentemente for-Array(n)(B, C) es mucho más lento en safari que for-[](A)
  • Sorprendentemente for-[](A) para gran variedad es lento en todos los navegadores
  • soluciones K es lento para matrices pequeñas para todos los navegadores
  • Las soluciones A, E, G son lentas para grandes matrices para todos los navegadores
  • la solución M es la más lenta para todas las matrices en todos los navegadores

ingrese la descripción de la imagen aquí

Conclusiones para la matriz 2d inicializada

  • Las soluciones basadas en for/while(A, B, C, D, E, G) son más rápidas / bastante rápidas para arreglos pequeños en todos los navegadores
  • Las soluciones basadas en for(A, B, C, E) son más rápidas / bastante rápidas para grandes matrices en todos los navegadores
  • Las soluciones basadas en Array..map/from/fill(I, J, K, L, M) son medio rápidas o lentas para arreglos pequeños en todos los navegadores
  • Las soluciones F, G, H, I, J, K, L para matrices grandes son medianas o rápidas en Chrome y Safari pero son más lentas en Firefox.
  • La solución esotérica {}/arr[[i,j]](N) es más lenta para arreglos pequeños y grandes en todos los navegadores

ingrese la descripción de la imagen aquí

Detalles

Pruebe las soluciones que no llenan (inicializan) la matriz de salida

Probamos la velocidad de las soluciones para

  • matrices pequeñas (12 elementos): puede realizar pruebas en su máquina AQUÍ
  • matrices grandes (1 millón de elementos): puede realizar pruebas en su máquina AQUÍ

Pruebe las soluciones que llenan (inicializan) la matriz de salida

Probamos la velocidad de las soluciones para

  • matrices pequeñas (12 elementos): puede realizar pruebas en su máquina AQUÍ
  • matrices grandes (1 millón de elementos): puede realizar pruebas en su máquina AQUÍ

ingrese la descripción de la imagen aquí

Kamil Kiełczewski
fuente
7

Encontré a continuación es la forma más simple:

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

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);
GMsoF
fuente
array1[1][100] = 666;tirosUncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski
@ KamilKiełczewski tiene razón, parece que esto solo se inicia para la primera matriz de matriz, para la segunda antes de hacerlo array1[1][100] = 666;, debe hacer esto array1[1] = [];.
GMsoF
6

Javascript no admite matrices bidimensionales, en su lugar almacenamos una matriz dentro de otra matriz y recuperamos los datos de esa matriz dependiendo de la posición de la matriz a la que desea acceder. Recuerde que la numeración de la matriz comienza en CERO .

Ejemplo 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
Almiar
fuente
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);

antílope
fuente
6

ES6 +, ES2015 + puede hacer esto de una manera aún más simple


Creando una matriz de 3 x 2 llena de verdadero

[...Array(3)].map(item => Array(2).fill(true))
jwchang
fuente
Necesito confesar "Adopté" tu respuesta y agregué a la mía , la colección de frases.
mi-
5

Tuve que hacer una función de matriz flexible para agregarle "registros" cuando lo necesitaba y para poder actualizarlos y hacer los cálculos necesarios antes de enviarlo a una base de datos para su posterior procesamiento. Aquí está el código, espero que ayude :).

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"
}

Siéntase libre de optimizar y / o señalar cualquier error :)

CJ Mendes
fuente
¿Qué tal solo aLine.push([clmn1, clmn2, clmn3]);?
Pimp Trizkit
5

Aquí hay una forma rápida que he encontrado para hacer una matriz bidimensional.

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

También puede convertir fácilmente esta función en una función ES5.

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

Por qué esto funciona: el new Array(n)constructor crea un objeto con un prototipo Array.prototypey luego asigna el objeto length, lo que resulta en una matriz despoblada. Debido a su falta de miembros reales, no podemos ejecutar la Array.prototype.mapfunción en él.

Sin embargo, cuando proporciona más de un argumento al constructor, como cuando lo hace Array(1, 2, 3, 4), el constructor usará el argumentsobjeto para crear instancias y llenar unArray objeto correctamente.

Por esta razón, podemos usar Array.apply(null, Array(x)), porque la applyfunción extenderá los argumentos en el constructor. Para aclarar, hacer Array.apply(null, Array(3))es equivalente a hacer Array(null, null, null).

Ahora que hemos creado una matriz poblada real, todo lo que tenemos que hacer es llamar mapy crear la segunda capa ( y).

dimiguel
fuente
5

Debajo de uno, crea una matriz de 5x5 y las llena con null

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

console.log(md);

zeah
fuente
3
Esta respuesta es incorrecta. Creará una matriz con la misma matriz rellenando sus ranuras. md[1][0] = 3 y todos los demás elementos se actualizan también
Qiang
5

Los tamaños de fila y columna de una matriz conocida solo en el tiempo de ejecución, entonces el siguiente método podría usarse para crear una matriz dinámica en 2d .

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
SridharKritha
fuente
4

Hay otra solución, que no te obliga a predefinir el tamaño de la matriz 2d, y es muy conciso.

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

Esto funciona porque, [1,2]se transforma en una cadena, que se utiliza como una clave de cadena para el tableobjeto.

Oli
fuente
Esta respuesta por sí sola hace que no quiera meterme con la basura que son arreglos "multidimensionales" en JavaScript, aunque tengo una solución muy elegante. Esto también ilustra que todos los demás no están haciendo matrices multidimensionales en absoluto. una "matriz" en JavaScript; esta respuesta "simulará" por completo una matriz de dimensiones infinitas de tamaño pseudoinfinito de tamaños y contenidos arbitrarios. Todas las demás respuestas basadas en recursiones y bucles tienen un límite superior mucho más bajo para el tamaño de la estructura de matriz que pueden crear. Y la creación la velocidad será un problema importante para estas estructuras más grandes.
Pimp Trizkit
Utilice esta línea en su lugar para simular el llenado previo:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit
Forma agradable y creativa de "emular" Array2D por objeto :)
Kamil Kiełczewski
4

Para crear una matriz 4x6, simplemente haga esto

const x = [...Array(6)].map(elem => new Array(4))
invitado
fuente