有没有一个函数可以创建4D数组(或任意维数的数组)?
我想调用这个函数,然后就可以像这样做:arr[3][2][23][12] = "棒极了";
有没有一个函数可以创建4D数组(或任意维数的数组)?
我想调用这个函数,然后就可以像这样做:arr[3][2][23][12] = "棒极了";
function make(dim, lvl, arr) {
if (lvl === 1) return [];
if (!lvl) lvl = dim;
if (!arr) arr = [];
for (var i = 0, l = dim; i < l; i += 1) {
arr[i] = make(dim, lvl - 1, arr[i]);
}
return arr;
}
var myMultiArray = make(4);
var myMultiArray = make(64, 4);
myMultiArray[X][X][X][X] = ....
但X必须始终小于64。例如,您不能设置myMultiArray[X][70][X][X]
,因为myMultiArray[X][70]
尚未定义。
注意-运行make(64, 4)
非常缓慢-您正在创建64 ^ 4个空数组元素(即16,777,216)。
更新2:您可以将最后一个值设置为任何数字或字符串。即myMultiArray[X][X][X][Y]
,其中X < 64,Y可以是任何内容。
该算法也已经被优化,再试一次吧。
var adjMatrix = makeArray(4);
adjMatrix[6][2][4][5] = 'foobar';
alert(adjMatrix[6][2][4][5]);
但是弹出框没有显示。 - trusktr简单粗暴:
var arr = [[[[[]]]]];
请查看 http://jsfiddle.net/MJg9Y/
注意:您仍然需要初始化每个维度。上面的代码为arr[0]
创建了一个4维数组的基础。
arr[0][1][0][3] = 'test'; alert(arr[0][1][0][3]);
但是没有成功。你会怎么设置它呢? - trusktrarr[1] = [[[]]]
。 但你需要一路这样做。所以递归函数可能会更少繁琐。我只是提供了初始化数组的 快速且简单 的方法。 - Jason McCrearyarr = [[[],[[[],[],[],['test']]]]]; alert(arr[0][1][0][3]);
成功了! ;-) - Apolo//adds a multidimensional array of specified depth to a given array
//I prototyped it off of array for convenience, but you could take
//just the mdim function
Array.prototype.pushDeepArr = function( depth ){
var arr = (mdim = function( depth ){
if( depth-- > 1 ){
return [ mdim( depth ) ];
} else {
return [];
}
})(depth);
this.push(arr);
};
//example: create an array, add two multidimensional arrays
//one of depth 1 and one of depth 5
x = [];
x.pushDeepArr(1);
x.pushDeepArr(5);
x
上执行.pushDeepArr(1)
和.pushDeepArr(5)
之后,你得到了什么?例如,我想让前两维的大小为3,后两维的大小为6,我应该如何使用.pushDeepArr()
构建x
,以便最后一个项是x [2] [2] [5] [5]
? - trusktr[ [], [[[[[]]]]] ]
。该函数只是构建深度。为了获得每个级别的正确长度,我想它需要一个参数来保存每个级别的宽度。 - cm2只需将现有数组中的每个值设置为一个新数组,其中包含所需数量的元素。
参见此教程获取一些好的示例。您可以使用任意维度来完成此操作。
var myArray = new Array(3);
for (var i = 0; i < 3; i++) {
myArray[i] = new Array(3);
for (var j = 0; j < 3; j++) {
myArray[i][j] = '';
}
}
makeArray(2,4,3,6);
其中每个int都是每个维度的大小。 - trusktr更新 修正了之前函数中的一些问题;这似乎是解决问题的方法:
function multidimensionalArray(){
var args = Array.prototype.slice.call(arguments);
function helper(arr){
if(arr.length <=0){
return;
}
else if(arr.length == 1){
return new Array(arr[0]);
}
var currArray = new Array(arr[0]);
var newArgs = arr.slice(1, arr.length);
for(var i = 0; i < currArray.length; i++){
currArray[i] = helper(newArgs);
}
return currArray;
}
return helper(args);
}
使用方法
var a = multidimensionalArray(2,3,4,5);
console.log(a); //prints the multidimensional array
console.log(a.length); //prints 2
console.log(a[0].length); //prints 3
console.log(a[0][0].length); //prints 4
console.log(a[0][0][0].length); //prints 5
array[x][y] = MultiDimensionalArray(7,2);
这样的东西。 - trusktrfunction arrayGen(content,dims,dim1Len,dim2Len,dim3Len...) {
var args = arguments;
function loop(array,dim) {
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 = [];
thisArray = loop(thisArray,1);
return thisArray;
};
我经常使用这个函数,它可以节省很多时间。
顺便说一下,我发布了一个带有三维数组的对象这里。在那个例子中,
objTeams.aaastrTeamsByLeagueCityYear["NFL"]["Detroit"][2012] == "Lions".
function ArrayND(initVal)
{
var args = arguments;
var dims=arguments.length-1
function ArrayCreate(cArr,dim)
{
if(dim<dims)
{
for(var i=0;i<args[1 + dim];i++)
{
if(dim==dims-1) cArr[i]=initVal
else cArr[i]=ArrayCreate([],dim+1)
}
return cArr
}
}
return ArrayCreate([],0)
}
var a=ArrayND("Hello",2,3)
var a=ArrayND("Hello",2,3,4,5)