JavaScript 4D 数组

3

有没有一个函数可以创建4D数组(或任意维数的数组)?

我想调用这个函数,然后就可以像这样做:arr[3][2][23][12] = "棒极了";


可能是有没有更简洁的方法来初始化空的多维数组?的重复问题。 - Anderson Green
8个回答

8
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
1
如果adjMatrix[6]还不存在,那么你不能给adjMatrix[6][2]赋值。看起来你需要一个函数来指定每个维度的深度。我会更新这个函数。 - Matty F
哇,太棒了!虽然如果不小心使用可能会对内存使用造成负面影响,但它确实做到了我想要的!双手竖起来! - trusktr
1
刚刚更新了优化,应该会有很大的改进。 - Matty F

5

简单粗暴:

var arr = [[[[[]]]]];

请查看 http://jsfiddle.net/MJg9Y/

注意:您仍然需要初始化每个维度。上面的代码为arr[0]创建了一个4维数组的基础。


我尝试过这样做: arr[0][1][0][3] = 'test'; alert(arr[0][1][0][3]); 但是没有成功。你会怎么设置它呢? - trusktr
你可以在数组创建完成后像你的示例那样这样做吗? - trusktr
1
是的,所以 arr[1] = [[[]]]。 但你需要一路这样做。所以递归函数可能会更少繁琐。我只是提供了初始化数组的 快速且简单 的方法。 - Jason McCreary
1
@trusktr 只是为了好玩: arr = [[[],[[[],[],[],['test']]]]]; alert(arr[0][1][0][3]); 成功了! ;-) - Apolo

3
这是一个简单的递归解决方案。真正的核心是mdim函数。如果深度不为1,它只是调用自身,当它到达那里时,返回一个空数组。
由于似乎您可能想要将其用于许多事情,因此我已经将其包装在Array的原型中,以便您可以自动使用它(方便性/可维护性权衡)。如果您喜欢,从闭包中获取mdim函数应该也可以正常工作。
最后有一个简单的测试用例,以便您了解如何使用它。祝你好运! :)
//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
在这种情况下,x将是[ [], [[[[[]]]]] ]。该函数只是构建深度。为了获得每个级别的正确长度,我想它需要一个参数来保存每个级别的宽度。 - cm2

2

只需将现有数组中的每个值设置为一个新数组,其中包含所需数量的元素。

参见此教程获取一些好的示例。您可以使用任意维度来完成此操作。

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] = '';
    }
}

这看起来很酷...如果有一个递归函数版本,你想要4个数组就会有4个循环,那将是非常棒的!调用可能是这样的:makeArray(2,4,3,6);其中每个int都是每个维度的大小。 - trusktr

1

更新 修正了之前函数中的一些问题;这似乎是解决问题的方法:

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

这只是2D的... 嗯...但也许我可以做一些像 array[x][y] = MultiDimensionalArray(7,2); 这样的东西。 - trusktr
@trusktr,显然这不是答案。 - Jason McCreary
这是一个好主意。尽管没有针对参数的切片方法,但可以将其转换为普通的 JavaScript 数组。 - trusktr
1
@trusktr 我后来也意识到了这一点!我更新了我的答案,这次似乎可以工作了。有趣的练习 :) - no.good.at.coding
非常好!这是最灵活的解决方案,非常强大。谢谢! - trusktr

1
非常简单的函数,生成具有任意维度的数组。指定每个维度的长度和内容,对我来说通常是 ''。
function 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;
};

我经常使用这个函数,它可以节省很多时间。


1

顺便说一下,我发布了一个带有三维数组的对象这里。在那个例子中,

objTeams.aaastrTeamsByLeagueCityYear["NFL"]["Detroit"][2012] == "Lions".

1
使用以下函数创建和初始化任意维度的数组。
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)
}

例如,要创建一个2行3列的数组,请按以下方式使用它。
var a=ArrayND("Hello",2,3)

这将创建一个需要数组,并用“Hello”初始化所有值。
类似地,要创建4维数组,请像这样使用它。
var a=ArrayND("Hello",2,3,4,5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接