14

我一直在尝试找到一种相当简洁的方法来设置空的多维 JavaScript 数组的维度,但到目前为止还没有成功。

首先,我尝试使用 初始化一个空的 10x10x10 数组var theArray = new Array(10, 10 10),但它只创建了一个包含 3 个元素的一维数组。

我已经想出了如何使用嵌套的 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));
4

6 回答 6

6

改编自这个答案

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);给出一个等长的 3 维数组。
  • var weirdArray = createArray(34,6,42,2);给出一个长度不等的 4 维数组。
于 2013-07-21T19:57:35.180 回答
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

演示http://jsfiddle.net/WPrs3/

于 2013-07-21T20:00:42.497 回答
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/

于 2013-07-21T19:58:50.570 回答
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 维数组或能够推送/弹出的数组等的偏好。

于 2013-07-23T19:43:32.557 回答
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在叶值中将在叶值中提供索引值。

在以下位置玩它:http: //jsfiddle.net/jstoolsmith/r3eMR/

于 2013-07-24T09:18:01.083 回答
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;
};

我经常使用这个功能,它节省了很多时间

于 2015-02-06T00:26:08.573 回答