是否有更短,更好的方法来生成'n'长度的2D阵列?
var a = (function(){ var i=9, arr=[]; while(i--) arr.push([]); return arr })();
a // [ [],[],[],[],[],[],[],[],[] ]
**老派短途**:
var a = (function(a){ while(a.push([]) < 9); return a})([]);
更新 - 使用ES2015
Array(5).fill().map(a=>[]); // will create 5 Arrays in an Array
// or
Array.from({length:5}, a=>[])
清空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); // [[],[],[]]
答案 0 :(得分:23)
另一种方式:
for(var a = [];a.length < 10; a.push([])); // semicolon is mandatory here
另一种方式:
var a = []; while(a.push([]) < 10);
这是有效的,因为.push()
[docs](specification)返回数组的新长度。
那就是说,这是“减少代码”的错误方式。创建一个具有有意义名称的专用函数并使用此函数。您的代码将更容易理解:
function get2DArray(size) {
size = size > 0 ? size : 0;
var arr = [];
while(size--) {
arr.push([]);
}
return arr;
}
var a = get2DArray(9);
代码的阅读频率远高于写入代码。
答案 1 :(得分:5)
刚刚发现了另一种带有一行表达式的 ES6 方式:
Array.from({length: N}, () => [])
Array.from(arrayLike [,mapFn [,thisArg]])
有关其实施/ polyfill的更多细节⇢MDN Array.from()
在array spread syntax
的帮助下又一个简洁的解决方案:
[...Array(N)].map(() => [])
答案 2 :(得分:3)
Array(cardinality).fill(0).map(function(item) {return [];});
其中基数是您正在查看的项目数。在这种情况下,它将是9.这是我的一位同事实际建议的。这很整洁,我认为:)这是从ECMA V6有效。文档:Array::fill
答案 3 :(得分:0)
更短的方式可以是:
for(var i=9,a=[];i>=0;i--){ a.push([]) }
答案 4 :(得分:0)
var a = [];
var max_length = 10;
for(var i = 0; i < max_length; ++i){
a[i] = [];
}
答案 5 :(得分:0)
for(var i=9,a=[];i>=0;i--){ a.push([]) }
答案 6 :(得分:0)
在ES6中:
(m, n, initialElementValue) => Array(m).fill(Array(n).fill(initialElementValue))
答案 7 :(得分:0)
var x = 3, y = 5, arr = Array(y).fill();
arr = arr.map(function(){return Array(x).fill(' ')});
console.log(arr);
&#13;
答案 8 :(得分:0)
通过Array.from
通过ES6在js中生成2D数组的最佳方法
function twodimension(input) {
let index = 0,
sqrt = Math.sqrt(input.length);
return Array.from({
length: sqrt
}, (nothing, i) => Array.from({
length: sqrt
}, (nothingTwo, j) => input[index++]))
}
console.log(twodimension('abcdefghijklmnopqrstupwxy'))
console.log(twodimension([1,2,3,4,5,6,7,8,9]))
function input(length, fill) {
let getNums = length * length;
let fillNums = 1
if (fill == 'minus') {
return Array.from({
length: length
}, (nothing, i) => Array.from({
length: length
}, (nothingTwo, j) => getNums--))
} else if (fill == 'plus') {
return Array.from({
length: length
}, (nothing, i) => Array.from({
length: length
}, (nothingTwo, j) => fillNums++))
}
// you can dping snake ladders also with Array.from
if (fill === 'snakes') {
return Array.from({
length: length
}, (_, one) =>
Array.from({
length: length
}, (_, two) => getNums--)
).map((el, i) =>
i % 2 == 1 && length % 2 == 0 ? el.reverse() :
i % 2 == 0 && length % 2 == 1 ? el.reverse() : el
);
}
}
console.log(input(8, 'minus'))
console.log(input(10, 'plus'))
console.log(input(5, 'snakes'))
您可以使用Array.from做任何事情,它易于使用且速度快, 这是ES6语法中的新方法
答案 9 :(得分:-1)
var a = []; for(var i=0;i<10;i++) { a[i] = []; }