生成空2D阵列的最佳方法

vsy*_*ync 18 javascript arrays

是否有更短,更好的方法来生成'n'长度的2D阵列?

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

a // [ [],[],[],[],[],[],[],[],[] ]
Run Code Online (Sandbox Code Playgroud)

**老派短途**:

var a = (function(a){ while(a.push([]) < 9); return a})([]);
Run Code Online (Sandbox Code Playgroud)

更新 - 使用ES2015

Array(5).fill().map(a=>[]); // will create 5 Arrays in an Array
// or
Array.from({length:5}, a=>[])
Run Code Online (Sandbox Code Playgroud)

清空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); // [[],[],[]]
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 23

其他方式:

for(var a = [];a.length < 10; a.push([])); // semicolon is mandatory here
Run Code Online (Sandbox Code Playgroud)

另一种方式:

var a = []; while(a.push([]) < 10);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为.push() [docs](规范)返回数组的新长度.


也就是说,这是"减少代码"的错误方式.创建一个具有有意义名称的专用函数并使用此函数.您的代码将更容易理解:

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

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

    return arr;
}

var a = get2DArray(9);
Run Code Online (Sandbox Code Playgroud)

代码的读取频率比写入的频率高.


Xle*_*lee 5

刚发现另一个带有一行表达式的ES6方式:

Array.from({length: N}, () => [])
Run Code Online (Sandbox Code Playgroud)

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

关于它的实现/ polyfill的更多细节⇢MDN Array.from()

在以下帮助下又一个简洁的解决方案array spread syntax:

[...Array(N)].map(() => [])
Run Code Online (Sandbox Code Playgroud)