javascript - two - La mejor manera de generar una matriz 2D vacía
matrix javascript example (9)
Acabo de descubrir otra forma de ES6 con una expresión de línea:
Array.from({length: N}, () => [])
Array.from (arrayLike [, mapFn [, thisArg]])
Más detalles sobre su implementación / polyfill ⇢ MDN Array.from ()
Otra solución interesante con la ayuda de la array spread syntax
de array spread syntax
:
[...Array(N)].map(() => [])
¿Existe una forma mejor y más corta de generar un arreglo 2D de ''n'' longitud?
var a = (function(){ var i=9, arr=[]; while(i--) arr.push([]); return arr })();
a // [ [],[],[],[],[],[],[],[],[] ]
** camino corto de la vieja escuela **:
var a = (function(a){ while(a.push([]) < 9); return a})([]);
ACTUALIZACIÓN - Uso de ES2015
Array(5).fill().map(a=>[]); // will create 5 Arrays in an Array
// or
Array.from({length:5}, a=>[])
Vaciar matriz 2D (ahorra memoria en lugar)
function make2dArray(len){
var a = [];
while(a.push([]) < len);
return a;
}
function empty2dArray(arr){
for( var i = arr.length; i--; )
arr[i].length = 0;
}
// lets make a 2D array of 3 items
var a = make2dArray(3);
// lets populate it a bit
a[2].push(''demo'');
console.log(a); // [[],[],["demo"]]
// clear the array
empty2dArray(a);
console.log(a); // [[],[],[]]
De otra manera:
for(var a = [];a.length < 10; a.push([])); // semicolon is mandatory here
Otra forma más:
var a = []; while(a.push([]) < 10);
Esto funciona porque .push()
[docs] ( specification ) devuelve la nueva longitud de la matriz.
Dicho esto, esta es la manera incorrecta de "reducir el código". Cree una función dedicada con un nombre significativo y use esta. Tu código será mucho más comprensible:
function get2DArray(size) {
size = size > 0 ? size : 0;
var arr = [];
while(size--) {
arr.push([]);
}
return arr;
}
var a = get2DArray(9);
El código se lee mucho más a menudo que escrito.
En ES6:
(m, n, initialElementValue) => Array(m).fill(Array(n).fill(initialElementValue))
forma más corta puede ser:
for(var i=9,a=[];i>=0;i--){ a.push([]) }
var x = 3, y = 5, arr = Array(y).fill();
arr = arr.map(function(){return Array(x).fill('' '')});
console.log(arr);
for(var i=9,a=[];i>=0;i--){ a.push([]) }
var a = [];
var max_length = 10;
for(var i = 0; i < max_length; ++i){
a[i] = [];
}
var a = []; for(var i=0;i<10;i++) { a[i] = []; }
Array(cardinality).fill(0).map(function(item) {return [];});
donde cardinalidad es el número de elementos que está mirando. En este caso, sería 9. Esto fue sugerido por uno de mis colegas en realidad. Esto es bueno, creo :) Esto es válido desde ECMA V6. Documentación: Array::fill