【问题标题】:Javascript 4D arraysJavascript 4D 数组
【发布时间】:2011-08-28 12:40:59
【问题描述】:

任何人都有创建 4D 数组(或任何数量的维度)的功能吗?

我想调用该函数,然后我可以执行arr[3][2][23][12] = "awesome";之类的操作

【问题讨论】:

标签: javascript arrays function multidimensional-array


【解决方案1】:

只需将现有数组中的每个值都设置为一个新数组,无论您需要多少元素。

请参阅this tutorial 了解一些很好的示例。您可以对任意数量的维度执行此操作。

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 个 for 循环,那就太棒了!调用可能是这样的:makeArray(2,4,3,6); 其中每个 int 将是每个维度的大小。
【解决方案2】:

更新 修正了之前功能的一些问题;这似乎可以解决问题:

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,显然这不是答案。
  • 这是个好主意。虽然没有参数的切片方法,但它可以转换为普通的 javascript 数组。
  • @trusktr 我后来也意识到了!我已经更新了我的答案,这一次似乎有效。有趣的练习:)
  • 非常好!这是最灵活的解决方案,非常强大。谢谢!
【解决方案3】:
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:您可以将最后一个值作为任何数字或字符串来处理。 IE。 myMultiArray[X][X][X][Y] 其中 X

算法也优化了,再试试看。

【讨论】:

  • 我试过了,但没有按预期工作。我这样做了:var adjMatrix = makeArray(4); adjMatrix[6][2][4][5] = 'foobar'; alert(adjMatrix[6][2][4][5]); 但警报不起作用。
  • 如果 adjMatrix[6] 尚不存在,则无法分配 adjMatrix[6][2],听起来您需要一个函数来指定每个维度的深度。将用一个更新这个
  • 哇,太棒了!虽然如果不小心使用它可能对内存使用不利,但它正是我想要的!竖起两个大拇指!
  • 刚刚更新了优化,应该会做出重大改进
【解决方案4】:

又快又脏:

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

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

注意:您仍然需要初始化每个维度。以上为arr[0] 的 4 维数组奠定了基础。

【讨论】:

  • 我试过这样做:arr[0][1][0][3] = 'test'; alert(arr[0][1][0][3]); 但这没有用。例如,您将如何设置?
  • 在您的示例中已经创建了数组之后,您会这样做吗?
  • 是的,所以arr[1] = [[[]]]。不过,您需要一直这样做。所以递归函数可能不那么乏味。我只是提供了一种快速而肮脏的方式来初始化一个数组。
  • @trusktr 只是为了好玩:arr = [[[],[[[],[],[],['test']]]]]; alert(arr[0][1][0][3]); 有效! ;-)
【解决方案5】:

这是一个简单的递归解决方案。真正的大脑是 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);

【讨论】:

  • 哇,这看起来很棒。所以在你.pushDeepArr(1).pushDeepArr(5)x 之后,这到底给你留下了什么?例如,我希望前两个维度的大小为 3,后两个维度的大小为 6,我将如何使用 .pushDeepArr() 构建 x 所以最后一项将是 x[2][2][ 5][5]?
  • 在这种情况下,x 将是[ [], [[[[[]]]]] ]。这个函数只是建立深度。为了获得每个级别的正确长度,我想它需要一个参数来保存每个级别的宽度。
【解决方案6】:

Fwiw,我发布了一个带有三维数组here 的对象。在那个例子中,

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

【讨论】:

    【解决方案7】:

    非常简单的函数,生成任意维数的数组。指定每个维度的长度和对我来说通常是''的内容

    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;
    };
    

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

    【讨论】:

      【解决方案8】:

      使用以下函数创建和初始化任意维度的Array

      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)
      

      这将创建 require 数组并使用“Hello”初始化所有值

      类似地创建 4 维数组使用它像

      var a=ArrayND("Hello",2,3,4,5)
      

      【讨论】:

        猜你喜欢
        • 2013-09-28
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 2016-04-08
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多