Лучший способ создать пустой 2D-массив

существует более короткий, лучший способ генерации 2D массива длины n?

var a = (function(){ var i=9, arr=[]; while(i--) arr.push([]); return arr })();

a // [ [],[],[],[],[],[],[],[],[] ]

UPDATE - самый короткий путь на данный момент:

var a = (function(a){ while(a.push([]) < 9); return a})([]);

ОБНОВЛЕНИЕ - Использование ES6

Array(5).fill().map(()=> []); // will create 5 Arrays in an Array

Опорожнение 2D-массива (сохраняет память вместо повторного создания другого:

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); // [[],[],[]]

Ответы

Ответ 1

Другой способ:

for(var a = [];a.length < 10; a.push([])); // semicolon is mandatory here

Еще один способ:

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

Это работает, потому что .push() [docs] (спецификация) возвращает новую длину массива.


Тем не менее, это неправильный способ "сокращения кода". Создайте специальную функцию со значимым именем и используйте ее. Ваш код будет намного понятнее:

function get2DArray(size) {
    size = size > 0 ? size : 0;
    var arr = [];

    while(size--) {
        arr.push([]);
    }

    return arr;
}

var a = get2DArray(9);

Код читается гораздо чаще, чем написано.

Ответ 2

Просто обнаружил еще один способ ES6 с вызовом одной функции:

Array.from({length: N}, () => [])

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

Подробнее о его реализации / polyfill ⇢ MDN Array.from()

Еще одно опрятное решение с помощью array spread syntax:

[...Array(N)].map(() => [])

Ответ 3

Array(cardinality).fill(0).map(function(item) {return [];});

где мощность - это количество предметов, на которые вы смотрите. В этом случае это будет 9. Это было предложено одним из моих коллег на самом деле. Это просто, я думаю:) Это справедливо из ECMA V6. Документация: Array:: fill

Ответ 4

более короткий путь может быть:

for(var i=9,a=[];i>=0;i--){ a.push([]) }

Ответ 5

var a = [];
var max_length = 10;
for(var i = 0; i < max_length; ++i){ 
    a[i] = []; 
}

Ответ 6

for(var i=9,a=[];i>=0;i--){ a.push([]) }

Ответ 7

В ES6:

(m, n, initialElementValue) => Array(m).fill(Array(n).fill(initialElementValue))

Ответ 8

var x = 3, y = 5, arr = Array(y).fill();
arr = arr.map(function(){return Array(x).fill(' ')});
console.log(arr);

Ответ 9

var a = []; for(var i=0;i<10;i++) { a[i] = []; }