Javascript 生成空2D数组的最佳方法

Javascript 生成空2D数组的最佳方法,javascript,arrays,Javascript,Arrays,是否有一种更短、更好的方法来生成“n”长的二维数组 var a = (function(){ var i=9, arr=[]; while(i--) arr.push([]); return arr })(); a // [ [],[],[],[],[],[],[],[],[] ] **老派短途**: var a = (function(a){ while(a.push([]) < 9); return a})([]); 清空2D数组(更节省内存) 函数make2dArray(len

是否有一种更短、更好的方法来生成“n”长的二维数组

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

a // [ [],[],[],[],[],[],[],[],[] ]
**老派短途**:

var a = (function(a){ while(a.push([]) < 9); return a})([]);
清空2D数组(更节省内存)

函数make2dArray(len){
var a=[];
而(a.push([])
var a=[];对于(var i=0;i较短的方法可以是:

for(var i=9,a=[];i>=0;i--){ a.push([]) }
for(var i=9,a=[];i>=0;i--){ a.push([]) }
var a=[];
var max_length=10;
对于(var i=0;i
另一种方式:

for(var a = [];a.length < 10; a.push([])); // semicolon is mandatory here
var a = []; while(a.push([]) < 10);
代码的读写次数要多得多

其中cardinality是您正在查看的项目数。在本例中为9。这实际上是我的一位同事建议的。这很简洁,我认为:)这在ECMA V6中有效。文档:

刚刚发现另一种ES6方式,使用一行表达式:

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

有关其实现的更多详细信息/polyfill⇢

另一个巧妙的解决方案是借助
数组扩展语法

[...Array(N)].map(() => [])
在ES6中:

(m, n, initialElementValue) => Array(m).fill(Array(n).fill(initialElementValue))
var x=3,y=5,arr=Array(y).fill();
arr=arr.map(函数(){returnarray(x).fill(“”)});

控制台日志(arr)
通过
array.from
ES6在js中生成2D数组的最佳方法

函数二维(输入){
设索引=0,
sqrt=Math.sqrt(input.length);
返回数组.from({
长度:sqrt
},(无,i)=>Array.from({
长度:sqrt
},(无二,j)=>输入[index++])
}
log(二维('abcdefghijklmnopqrstupwxy'))


log(twodimension([1,2,3,4,5,6,7,8,9]))
仅当您将其放入函数中时:
var a=make2D(9);)我正在为一个web工作者使用它,它每次初始化时都需要一个2D空数组。我想知道是否有一些新奇的EC5用于此BTW。更短并不一定更好(只是想指出标题和问题主体之间的差异;)。您可以通过将数组作为参数传递而不是声明它来缩短它:
var a=(函数(a){while(a.push([])<9);返回a})([])
请发布
console.log的输出(a)。我很好奇,看看它是否与张贴的OP相同。好吧,开玩笑吧-1这只是设置了长度,但没有初始化任何内容。这只是设置了长度,元素仍然是“未定义”的。这不会使用空数组创建n个条目。事实上,console.log返回的只是一个[]。我不知道为什么会被否决。。。它返回一个空的2D数组。
JSON.stringify(a)
的输出是
“[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]”
。这与我的输出完全相同。..yes'for'的字符数比'while'少,但仍然如此。您不妨对(var i=9,a=[];i--;)执行
){…
-这是better@vsync,为什么从9开始更好?@vsync——我添加了一个
max_length
param。为什么不呢?从零开始,然后在循环中添加,代码就更少了。它给出了相同的结果result@vsync,而不是在使用
a[i]=[]
——A最好从0@vsync:是的,不知何故,我认为我需要与10进行比较才能得到9个元素。但无论如何,我更喜欢10个:P;)我相信代码应该很小,但在开发中非常适合documenter,在生产中它被压缩了,所以通过这种方式可以获得更好的压缩率。我不知道“a.push([])'返回一个数字。这对我来说是新的,push返回一个数字,这非常有趣。@vsync:刚刚将它添加到我的答案中。因为它是这样定义的;)hmmm。我更喜欢一种更明显的方式,这是对某个变量的赋值。比如
var 2d=…
。如果您使用的是ES6,那么这应该是:
Array(5)。fill(0).map(()=>[])
@vsync,这是真的。但是,如果您愿意,您可以自己定义原型函数并在ECMA 5中使用它。这就是我在构建过程中所做的。我在构建过程中使用了Babel,因此它可以自动将其转换为ES5。这不会创建副本,而是使用相同的数组。例如,更改arr[0][1]将导致arr[1][1]和arr[2][1]发生更改。但这是可以做到的。您的回答没有提供任何其他人几年前没有提到的新信息。请注意,这不是一个函数调用bun N+1,因为您只调用了一次数组。from()和N次
()=>[]
函数用于Array.from内部发生的每次迭代。
function get2DArray(size) {
    size = size > 0 ? size : 0;
    var arr = [];

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

    return arr;
}

var a = get2DArray(9);
for(var i=9,a=[];i>=0;i--){ a.push([]) }
Array(cardinality).fill(0).map(function(item) {return [];});
Array.from({length: N}, () => [])
[...Array(N)].map(() => [])
(m, n, initialElementValue) => Array(m).fill(Array(n).fill(initialElementValue))