题 如何在JavaScript中创建二维数组?


我一直在网上阅读,有些地方说这是不可能的,有些人说它是,然后给出一个例子,其他人反驳这个例子,等等。

  1. 如何在JavaScript中声明二维数组? (假设有可能)

  2. 我如何访问其成员? (myArray[0][1] 要么 myArray[0,1]?)


920
2018-06-08 18:24


起源


假设一个有点迂腐的定义,在技术上不可能在javascript中创建一个二维数组。但是你可以创建一个数组数组,这相当于一样。 - I. J. Kennedy
重复 - stackoverflow.com/q/6495187/104380 - vsync
对于5x3 2D阵列,我会喜欢 var arr2D = new Array(5).fill(new Array(3)); 此外,如果您不希望细胞“未定义”,您可以这样做 var arr2D = new Array(5).fill(new Array(3).fill("hey")); - Redu
仅供参考...当您使用更多数组填充数组时 var arr2D = new Array(5).fill(new Array(3));,Array(5)的每个元素将指向相同的Array(3)。因此最好使用for循环来动态填充子数组。 - Josh Stribling
a = Array(5).fill(0).map(x => Array(10).fill(0)) - Longfei Wu


答案:


var items = [
  [1, 2],
  [3, 4],
  [5, 6]
];
console.log(items[0][0]); // 1
console.log(items);


1063
2018-06-08 18:27



以这种方式初始化大型多维数组将是困难的。然而, 这个功能 可用于创建空的多维,其中维度指定为参数。 - Anderson Green
@AndersonGreen你提到了一个对多D阵列解决方案感兴趣的链接是一件好事,但问题和Ballsacian1的答案是关于“2D”数组,而不是“multi-D”数组 - evilReiko
你应该经历整个事情......例如警报(项[0] [1]); // 2等 - Dois
@SashikaXP,这不适用于0以外的第一个索引。 - Michael Franzl
问题是如何声明二维数组。这是我正在寻找的,并找到了这个和以下的答案,无法辨别声明和初始化之间的区别。还有已知长度或无限制的声明,两者均未被讨论。 - chris


您只需将数组中的每个项目都设为一个数组。

var x = new Array(10);
for (var i = 0; i < 10; i++) {
  x[i] = new Array(20);
}
x[5][12] = 3.0;

375
2018-06-08 18:28



他们可以为键和值使用字符串之类的东西吗? myArray ['Book'] ['item1']? - Diego
@Diego,是的,但这不是数组的目的。当你的键是字符串时,最好使用一个对象。 - Matthew Crumley
我比接受的答案更喜欢这个例子,因为这可以用于动态大小的数组,例如 new Array(size) 哪里 size 是一个变量。 - Variadicism
不起作用 - 分配错误。如果没用,这个答案如何得到280个喜欢? - Gargo
这是有效的,谢谢。你可以看到示例Gargo jsfiddle.net/matasoy/oetw73sj - matasoy


与activa的答案类似,这是一个创建n维数组的函数:

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[length-1 - i] = createArray.apply(this, args);
    }

    return arr;
}

createArray();     // [] or new Array()

createArray(2);    // new Array(2)

createArray(3, 2); // [new Array(2),
                   //  new Array(2),
                   //  new Array(2)]

163
2018-06-08 20:49



这可以创建一个4维数组吗? - trusktr
@trusktr:是的,您可以根据需要创建任意数量的维度(在内存限制范围内)。只需传递四个维度的长度。例如, var array = createArray(2, 3, 4, 5);。 - Matthew Crumley
太好了!我实际上在这里问过这件事: stackoverflow.com/questions/6053332/javascript-4d-arrays 和各种有趣的答案。 - trusktr
最佳答案 !但是,我不建议使用0或1参数(无用) - Apolo
你说的n维吗?这可以创建一个5维数组吗? - BritishDeveloper


Javascript只有一维数组,但你可以构建数组数组,正如其他人指出的那样。

以下函数可用于构建固定尺寸的二维数组:

function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

列数并不重要,因为在使用之前不需要指定数组的大小。

然后你可以打电话:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...

65
2018-06-08 18:32



我想制作一个代表一副牌的2-Dim阵列。这将是一个2-Dim数组,其中包含卡片值,然后是套装。最简单的方法是什么? - Doug Hauf
函数Create2DArray(rows){var arr = []; for(var i = 0; i <rows; i ++){arr [i] = []; } return arr;函数print(deck){for(t = 1; t <= 4; t ++){for(i = 1; i <= 13; i ++){document.writeln(deck [t] [i]); fucntion fillDeck(d){for(t = 1; t <= 4; t ++){myCardDeck [t] [1] = t; for(i = 1; i <= 13; i ++){myCardDeck [t] [i] = i; function loadCardDeck(){var myCardDeck = Create2DArray(13); fillDeck(myCardDeck);打印(myCardDeck); } - Doug Hauf
@Doug:你实际上想要一个具有2个属性的一维对象数组。 var deck = []; deck [0] = {face:1,suit:'H'}; - TeasingDart
@DougHauf这是一个缩小的2D数组? :P:D - Mahi


最简单的方法:

var myArray = [[]];

59
2018-01-22 18:47



这是一个二维数组 - Maurizio In denmark
是的,小心点。分配myArray [0] [无论如何]很好,但是尝试设置myArray [1] [无论如何]它会抱怨myArray [1]未定义。 - Philip
@Philip你必须设置 myArray[1]=[]; 在分配之前 myArray[1][0]=5; - 182764125216
我们应该使用吗? [[]] 定义它是一个二维数组?或者干脆就做吧 [],我们可以使用一些方法 .push([2,3])? DEMO - chenghuayang
请注意,这样做 不 @AndersonGreen写道,“创建一个空的1x1数组”。它创建一个“1x0”数组(即包含0列数组的1行)。 myArray.length == 1 和 myArray[0].length == 0。如果然后将“真正空”的“0x0”数组复制到其中,则会产生错误的结果。 - JonBrave


有人说这是不可能的原因是因为二维数组实际上只是一个数组数组。这里的其他注释提供了在JavaScript中创建二维数组的完全有效的方法,但最纯粹的观点是你有一维对象数组,每个对象都是一个由两个元素组成的一维数组。

所以,这是观点冲突的原因。


41
2018-06-08 18:33



不,这不对。在某些语言中,您可以使用多维数组 string[3,5] = "foo";。对于某些情况,这是一种更好的方法,因为Y轴实际上不是X轴的子节点。 - Rafael Soares
一旦它到达底层机器代码,所有尺寸> 1的张量都是数组的数组,无论我们谈论哪种语言。出于缓存优化的原因,值得记住这一点。任何适合数字计算的合适语言都可以让你在内存中对齐你的多维结构,使你最常用的维度连续存储。我想到了Python的Numpy,Fortran和C.实际上,出于这个原因,有时候将维度降低到多个结构是值得的。 - Thomas Browne
计算机没有尺寸概念。内存地址只有一个维度。为了程序员的利益,其他一切都是符号装饰。 - TeasingDart
@ThomasBrowne不完全是。 “数组数组”需要一些内部数组的大小存储(它们可能不同)和另一个指向解除引用内部数组存储位置的指针。在任何“体面”语言中,多维数组与锯齿状数组不同,因为它们本身就是不同的数据结构。 (令人困惑的部分是C数组是多维的,即使它们用[a] [b]语法索引。) - polkovnikov.ph


很少有人表示使用推送:
为了带来新的东西,我将向您展示如何使用某个值初始化矩阵,例如:0或空字符串“”。
提醒一下,如果你有一个10元素数组,在javascript中最后一个索引将是9!

function matrix( rows, cols, defaultValue){

  var arr = [];

  // Creates all lines:
  for(var i=0; i < rows; i++){

      // Creates an empty line
      arr.push([]);

      // Adds cols to the empty line:
      arr[i].push( new Array(cols));

      for(var j=0; j < cols; j++){
        // Initializes:
        arr[i][j] = defaultValue;
      }
  }

return arr;
}

用法示例:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0

25
2017-08-08 02:22