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.
¿Cómo declaro una matriz bidimensional en JavaScript? (suponiendo que sea posible)
¿Cómo accedería a sus miembros? (
myArray[0][1]
omyArray[0,1]
?)
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.a = Array(5).fill(0).map(x => Array(10).fill(0))
fill
no requiere quenew 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 lamap
función, consulte: developer.mozilla.org/en-US/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.
Respuestas:
fuente
Simplemente convierte cada elemento dentro de la matriz en una matriz.
fuente
new Array(size)
dondesize
es una variable.Similar a la respuesta de activa, aquí hay una función para crear una matriz n-dimensional:
fuente
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]]]]]
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:
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:
fuente
La forma más fácil:
fuente
myArray[1]=[];
antes de asignarmyArray[1][0]=5;
myArray.length == 1
ymyArray[0].length == 0
. Lo que luego da el resultado incorrecto si copia una matriz "0x0" "realmente vacía".Cómo crear una matriz bidimensional vacía (una línea)
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.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
)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 queArray
no asignará las posiciones hasta que lo ordene a través de.fill
una asignación de valor directa o directa.Seguimiento
Aquí hay un método que parece correcto, pero tiene problemas .
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 significaarr[0][0] = 'foo'
que a realmente cambiaría dos filas en lugar de una.fuente
Array.from({length:5}, () => [])
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.
fuente
string[3,5] = "foo";
. Es un mejor enfoque para algunos escenarios, porque el eje Y no es en realidad un hijo del eje X.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!
ejemplos de uso:
fuente
for
(que establece el valor predeterminado) de su procedimiento y escribom=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.Dos líneas:
Generará una matriz a de la longitud 10, llena de matrices. (Push agrega un elemento a una matriz y devuelve la nueva longitud)
fuente
for (var a=[]; a.push([])<10;);
:?var
funciona. Siempre tiene un alcance funcional.La respuesta más sensata parece ser
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):
fuente
Array.apply(null, Array(nrows))
pero esto es mucho más elegante.fill
. Esto no funcionará en la mayoría de los navegadores.Array(nrows).map(() => 0)
o,Array(nrows).map(function(){ return 0; });
La forma más fácil:
fuente
Esto es lo que logré:
Esto me deletreó bineeshkumar
fuente
appVar[1][4] = "bineesh";
está mal, ¿cómo resolverlo?Las matrices bidimensionales se crean de la misma manera que las matrices unidimensionales. Y accedes a ellos como
array[0][1]
.fuente
No estoy seguro de si alguien ha respondido esto, pero descubrí que esto me funcionó bastante bien.
p.ej:
Para una matriz bidimensional, por ejemplo.
fuente
var array = [[],[]]
es adecuado.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.
Para crear una matriz, utilice este método como se muestra a continuación.
fuente
Para crear una matriz "2D" no dispersa (x, y) con todos los índices direccionables y valores establecidos en nulo:
Matriz "3D" de bonificación (x, y, z)
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.
fuente
fill
establezca el mismo valor. si cambianull
a `object, será el mismo objeto en cada columnalet 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
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.
Puede crear cualquier
n x m
matriz que desee y llenarla con un valor predeterminado llamandoMás ejemplos y documentación se pueden encontrar aquí .
Tenga en cuenta que esta no es una característica estándar todavía .
fuente
for
declaración sigue siendo un bucle ...Para los amantes de una línea Array.from ()
Otro (del comentario de dmitry_romanov) usa Array (). Fill ()
Uso del operador de propagación ES6 + ("inspirado" por la respuesta de InspiredJW :))
fuente
0
en la primerafill()
función:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
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:
Y el almacenamiento y acceso a los contenidos de la siguiente manera:
Esto imprimirá el resultado esperado
fuente
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
{}/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 grandesfor-[]/while
(A, G) son rápidas y son una buena opción para arreglos pequeños.for-[]
(B, C) son rápidas y son una buena opción para grandes matricesArray..map/from/fill
(I, J, K, L, M) son bastante lentas para matrices pequeñas y bastante rápidas para matrices grandesfor-Array(n)
(B, C) es mucho más lento en safari quefor-[]
(A)for-[]
(A) para gran variedad es lento en todos los navegadoresConclusiones para la matriz 2d inicializada
for/while
(A, B, C, D, E, G) son más rápidas / bastante rápidas para arreglos pequeños en todos los navegadoresfor
(A, B, C, E) son más rápidas / bastante rápidas para grandes matrices en todos los navegadoresArray..map/from/fill
(I, J, K, L, M) son medio rápidas o lentas para arreglos pequeños en todos los navegadores{}/arr[[i,j]]
(N) es más lenta para arreglos pequeños y grandes en todos los navegadoresDetalles
Pruebe las soluciones que no llenan (inicializan) la matriz de salida
Probamos la velocidad de las soluciones para
Mostrar fragmento de código
Pruebe las soluciones que llenan (inicializan) la matriz de salida
Probamos la velocidad de las soluciones para
Mostrar fragmento de código
fuente
Encontré a continuación es la forma más simple:
fuente
array1[1][100] = 666;
tirosUncaught TypeError: Cannot set property '100' of undefined
array1[1][100] = 666;
, debe hacer estoarray1[1] = [];
.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:
fuente
fuente
ES6 +, ES2015 + puede hacer esto de una manera aún más simple
Creando una matriz de 3 x 2 llena de verdadero
fuente
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 :).
Siéntase libre de optimizar y / o señalar cualquier error :)
fuente
aLine.push([clmn1, clmn2, clmn3]);
?Aquí hay una forma rápida que he encontrado para hacer una matriz bidimensional.
También puede convertir fácilmente esta función en una función ES5.
Por qué esto funciona: el
new Array(n)
constructor crea un objeto con un prototipoArray.prototype
y luego asigna el objetolength
, lo que resulta en una matriz despoblada. Debido a su falta de miembros reales, no podemos ejecutar laArray.prototype.map
funció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á elarguments
objeto para crear instancias y llenar unArray
objeto correctamente.Por esta razón, podemos usar
Array.apply(null, Array(x))
, porque laapply
función extenderá los argumentos en el constructor. Para aclarar, hacerArray.apply(null, Array(3))
es equivalente a hacerArray(null, null, null)
.Ahora que hemos creado una matriz poblada real, todo lo que tenemos que hacer es llamar
map
y crear la segunda capa (y
).fuente
Debajo de uno, crea una matriz de 5x5 y las llena con
null
fuente
md[1][0] = 3
y todos los demás elementos se actualizan tambiénLos 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 .
fuente
Hay otra solución, que no te obliga a predefinir el tamaño de la matriz 2d, y es muy conciso.
Esto funciona porque,
[1,2]
se transforma en una cadena, que se utiliza como una clave de cadena para eltable
objeto.fuente
var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Para crear una matriz 4x6, simplemente haga esto
fuente