我一直试图找到一种相当简洁的方法来设置空的多维JavaScript数组的维度,但到目前为止还没有成功。
首先,我尝试使用var theArray = new Array(10, 10 10)
初始化一个空的10x10x10数组,但相反,它只创建了一个包含3个元素的1维数组。
我已经想出如何使用嵌套的for循环初始化一个空的10x10x10数组,但以这种方式编写数组初始化器非常繁琐。使用嵌套的for循环初始化多维数组可能非常繁琐:是否有更简洁的方法在JavaScript中设置空多维数组的维度(具有任意多个维度)?
//Initializing an empty 10x10x10 array:
var theArray = new Array();
for(var a = 0; a < 10; a++){
theArray[a] = new Array();
for(var b = 0; b < 10; b++){
theArray[a][b] = new Array();
for(var c = 0; c < 10; c++){
theArray[a][b][c] = 10
}
}
}
console.log(JSON.stringify(theArray));
答案 0 :(得分:6)
改编自this answer:
function createArray(length) {
var arr = new Array(length || 0),
i = length;
if (arguments.length > 1) {
var args = Array.prototype.slice.call(arguments, 1);
while(i--) arr[i] = createArray.apply(this, args);
}
return arr;
}
只需使用参数调用每个维度的长度即可。 用法示例:
var multiArray = createArray(10,10,10);
给出一个长度相等的三维数组。var weirdArray = createArray(34,6,42,2);
给出一个不等长的四维数组。答案 1 :(得分:3)
function multiDimArrayInit(dimensions, leafValue) {
if (!dimensions.length) {
return leafValue;
}
var arr = [];
var subDimensions = dimensions.slice(1);
for (var i = 0; i < dimensions[0]; i++) {
arr.push(multiDimArrayInit(subDimensions, leafValue));
}
return arr;
}
console.log(multiDimArrayInit([2,8], "hi")); // counting the nested "hi"'s yields 16 of them
答案 2 :(得分:1)
以下是我对此问题的看法:nArray
效用函数
function nArray() {
var arr = new Array();
var args = Array.prototype.slice.call(arguments, 1);
for(var i=0;i<arguments[0];i++) {
arr[i] = (arguments.length > 1 && nArray.apply(this, args)) || undefined;
}
return arr;
}
用法示例:
var arr = nArray(3, 3, 3);
结果为3x3x3
未定义值数组。
运行带有一些测试的代码也可以在这里作为小提琴:http://jsfiddle.net/EqT3r/7/
答案 3 :(得分:0)
您拥有的尺寸越多,您对阵列使用单个平面阵列和getter / setter函数的兴趣就越大。
因为对于[d1 X d2 X d3 X .. X dn],您将创建d2 * d3 * ... * dn数组而不是一个,并且在访问时,您将使用n间接而不是1。
界面如下:
var myNArray = new NArray(10,20,10);
var oneValue = myNArray.get(5,8,3);
myNArray.set(8,3,2, 'the value of (8,3,2)');
实施取决于您对固定大小的偏好 n维数组或能够推/弹等的数组。
答案 4 :(得分:0)
更简洁的@chris代码版本:
function multiDim (dims, leaf) {
dims = Array.isArray (dims) ? dims.slice () : [dims];
return Array.apply (null, Array (dims.shift ())).map (function (v, i) {
return dims.length
? multiDim (dims, typeof leaf == 'string' ? leaf.replace ('%i', i + ' %i') : leaf)
: typeof leaf == 'string' ? leaf.replace ('%i', i) : leaf;
});
}
console.log (JSON.stringify (multiDim ([2,2], "hi %i"), null, ' '));
制作:
[
[
"hi 0 0",
"hi 0 1"
],
[
"hi 1 0",
"hi 1 1"
]
]
在此版本中,您可以将第一个参数作为单维数组的数字传递。
在叶值中包含%i
将在叶值中提供索引值。
答案 5 :(得分:0)
非常简单的功能,生成具有任意数量维度的数组。指定每个维度的长度以及对我来说通常为
的内容function arrayGen(content,dims,dim1Len,dim2Len,dim3Len...) {
var args = arguments;
function loop(dim) {
var array = [];
for (var a = 0; a < args[dim + 1]; a++) {
if (dims > dim) {
array[a] = loop(dim + 1);
} else if (dims == dim) {
array[a] = content;
}
}
return array;
}
var thisArray = loop(1);
return thisArray;
};
我经常使用这个功能,它可以节省很多时间