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


1137

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

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

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


21
假设有点古怪的定义,从技术上讲不可能在javascript中创建2d数组。但是您可以创建一个数组数组,这等同于相同的数组。
IJ肯尼迪

10
仅供参考...当您使用填充更多数组时var arr2D = new Array(5).fill(new Array(3));,Array(5)的每个元素都指向相同的Array(3)。因此,最好使用for循环来动态填充子数组。
乔什(Josh Stribling)

51
a = Array(5).fill(0).map(x => Array(10).fill(0))
龙飞吴

2
换句话说,fill不要调用new Array(3)要填充的数组的每个索引,因为它不是lambda表达式或其他任何东西,例如上述的Longfei Wu的注释,它最初用0填充数组,然后使用带有lambda的map函数来用新数组填充每个元素。fill函数只是使用您告诉它的内容简单地填充数组。那有意义吗?有关更多信息map功能,请参阅:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
乔希斯特里布林

2
@kalehmann很好:meta.stackoverflow.com/a/252017/2311074 If the new question is a better question or has better answers, then vote to close the old one as a duplicate of the new one.
亚当

Answers:


1231

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


32
这样很难初始化大型多维数组。但是,此功能可用于创建一个空的多维数据集,并将尺寸指定为参数。
Anderson Green

2
@AndersonGreen对于那些对多维数组解决方案感兴趣的人,您提到了一个链接是一件好事,但是问题和Ballsacian1的答案是关于“ 2D”数组,而不是“多D”数组
evilReiko 2014年

您应该仔细阅读所有内容,例如alert(items [0] [1]); // 2等
的DOI

1
@SashikaXP,这并不为0以外的第一指标的工作
迈克尔Franzl

1
问题是如何声明一个二维数组。这是我一直在寻找的东西,发现了这个问题以及随后的答案,无法分辨声明和初始化之间的区别。还有一个声明的长度已知或无限制的声明,都没有讨论。
克里斯,

444

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

var x = new Array(10);

for (var i = 0; i < x.length; i++) {
  x[i] = new Array(3);
}

console.log(x);


6
他们可以使用字符串之类的东西作为键和值吗?myArray ['Book'] ['item1']吗?
迭戈

42
@Diego,是的,但这不是数组的目的。当键是字符串时,最好使用一个对象。
马修·克鲁姆利2009年

10
我喜欢这个示例胜过接受的答案,因为可以为动态大小的数组(例如new Array(size)where size是变量)实现此示例。
变异主义

1
不起作用-分配错误。如果没用,这个答案怎么得到280个赞?
Gargo

1
很好,谢谢。您可以看到示例Gargo jsfiddle.net/matasoy/oetw73sj
matasoy 2016年

198

与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)]

2
这样可以创建一个4维数组吗?
trusktr 2011年

4
@trusktr:是的,您可以创建所需的任意尺寸(在内存限制内)。只需输入四个维度的长度即可。例如,var array = createArray(2, 3, 4, 5);
马修·克鲁姆利

4
最佳答案 !但是,我不建议将其与0或1个参数一起使用(无用)
Apolo

2
@BritishDeveloper 是的。这是一个5D数组,每个数组的长度为5:[[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]],[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]]]
haykam

2
@haykam很抱歉浪费您的时间-我被讽刺了:/
BritishDeveloper

84

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;
// ...

我想制作一个2维数组,代表一副纸牌。这将是一个2维数组,其中包含卡的值,然后是西装。最简单的方法是这样做。
Doug Hauf 2014年

1
函数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]); }}}功能fillDeck(d){for(t = 1; t <= 4; t ++){myCardDeck [t] [1] = t; 对于(i = 1; i <= 13; i ++){myCardDeck [t] [i] = i; }}} function loadCardDeck(){var myCardDeck = Create2DArray(13); fillDeck(myCardDeck); 打印(myCardDeck); }
Doug Hauf 2014年

2
@Doug:实际上,您需要具有2个属性的一维对象数组。var deck = []; deck [0] = {face:1,suit:'H'};
TeasingDart

@DougHauf是缩小的2D阵列?:P:D
Mahi

78

最简单的方法:

var myArray = [[]];

29
这是一个二维数组
Maurizio在丹麦,2013年

15
是的,请小心。分配myArray [0] [whatever]很好,但是尝试设置myArray [1] [whatever]会抱怨myArray [1]未定义。
菲利普

22
@Philip,您必须先设置,myArray[1]=[];然后才能分配myArray[1][0]=5;
182764125216

4
请注意,这并不像@AndersonGreen所写的那样 “创建一个空的1x1数组”。它创建一个“ 1x0”数组(即1行包含一个包含0列的数组)。 myArray.length == 1myArray[0].length == 0。如果随后将“真正为空”的“ 0x0”数组复制到其中,则会产生错误的结果。
JonBrave '16

3
@ 182764125216 对我来说这是一天的知识。谢谢:)
th3pirat3

76

如何创建一个空的二维数组(单行)

Array.from(Array(2), () => new Array(4))

图2和4分别是第一和第二尺寸。

我们利用Array.from,可以为每个元素采用类似数组的参数和可选的映射。

Array.from(arrayLike [,mapFn [,thisArg]])

var arr = Array.from(Array(2), () => new Array(4));
arr[0][0] = 'foo';
console.info(arr);

可以使用相同的技巧来创建包含1 ... N的JavaScript数组。


或者(但使用时效率低下 12%n = 10,000

Array(2).fill(null).map(() => Array(4))

性能下降的事实是,我们必须初始化第一个维度值才能运行.map。请记住,Array在您通过直通.fill或直接值分配进行订购之前, 不会分配头寸。

var arr = Array(2).fill(null).map(() => Array(4));
arr[0][0] = 'foo';
console.info(arr);


跟进

这是一种看似正确但有问题的方法

 Array(2).fill(Array(4)); // BAD! Rows are copied by reference

尽管它确实返回了显然需要的二维数组([ [ <4 empty items> ], [ <4 empty items> ] ]),但有一个问题:第一维数组已通过引用复制。这意味着a arr[0][0] = 'foo'实际上将更改两行而不是一行。

var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);


我建议这样做:Array.from({length:5}, () => [])
vsync

这里是主观的,但是这个答案(第一个和第二个)似乎是简洁,快速和现代的最佳平衡。
Brady Dowling

@zurfyx有什么想法,或者没有人知道,为什么webstorm在抱怨这一点?似乎array.from将值保留为未定义,然后即使创建的代码段在stackoverflow上运行良好,我也无法使用创建的数组
FaultyJuggler

46

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

因此,这就是观点冲突的原因。


41
不,这不对。在某些语言中,您可以使用诸如的多维数组string[3,5] = "foo";。对于某些情况,这是一种更好的方法,因为Y轴实际上不是X轴的子代。
拉斐尔·苏亚雷斯

3
一旦到达基础机器代码,所有维数大于1的张量都是数组的数组,无论我们使用哪种语言。出于缓存优化的考虑,值得牢记这一点。任何非常适合数值计算的体面语言都可以使您在内存中对齐多维结构,以便最连续使用的维被连续存储。我想到了Python的Numpy,Fortran和C。实际上,由于这种原因,在某些情况下值得将维数减少为多个结构。
Thomas Browne 2014年

计算机没有尺寸的概念。只有一维,即内存地址。其他一切都是为了程序员的利益而进行的符号修饰。
TeasingDart

3
@ThomasBrowne不完全是。“数组数组”需要一些存储空间来存储内部数组的大小(它们可能有所不同),并且需要另一个指针进行引用,以查找内部数组的存储位置。在任何“体面”语言中,多维数组与锯齿状数组不同,因为它们本身就是不同的数据结构。(而且令人困惑的是C数组是多维的,即使它们使用[a] [b]语法进行了索引。)
polkovnikov.ph 2015年

33

很少有人展示出push的用法:
要带来新的东西,我将向您展示如何使用一些值来初始化矩阵,例如: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

for从您的过程中删除了last (设置了默认值)并写入m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));-我们得到了非常临时的矩阵(嵌套太多)-您在最后一个for-defaultValue步骤中对其进行了修复,但是我认为您可以重写过程以使用更少的嵌套arras设置默认值。
卡米尔·基列夫斯基(KamilKiełczewski)

27

两线:

var a = []; 
while(a.push([]) < 10);

它将生成一个长度为10的数组,并用数组填充。(将元素添加到数组中并返回新的长度)


13
一班轮:for (var a=[]; a.push([])<10;);
Bergi 2014年

@Bergi仍将在下一行中定义一个变量吗?
StinkyCat

1
@StinkyCat:是的,就是这样var。它始终是功能范围的。
Bergi 2016年

我知道,因此,在这种情况下,您的单行代码是无用的:您无法“访问其成员”(检查问题)
StinkyCat 2016年

1
domenukk和@Bergi,您都是正确的。我尝试了一下,可以在for之后访问a。我道歉!谢谢你,这可能对我来说是一个教训;)
StinkyCat 2016年

24

最明智的答案似乎是

var nrows = ~~(Math.random() * 10);
var ncols = ~~(Math.random() * 10);
console.log(`rows:${nrows}`);
console.log(`cols:${ncols}`);
var matrix = new Array(nrows).fill(0).map(row => new Array(ncols).fill(0));
console.log(matrix);


注意,由于fill使用浅拷贝构造函数,因此我们不能直接填充行,因此所有行将共享相同的内存...以下示例演示如何共享每一行(取自其他答案):

// DON'T do this: each row in arr, is shared
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo'; // also modifies arr[1][0]
console.info(arr);

这应该是最顶层的。我做了类似的使用,Array.apply(null, Array(nrows))但这要优雅得多。
dimiguel '16

这是我最后的评论... Internet Explorer和Opera不支持fill。这不适用于大多数浏览器。
dimiguel

:@dimgl填充可在这种情况下进行仿真以恒定的地图Array(nrows).map(() => 0),或者Array(nrows).map(function(){ return 0; });
康纳尔奥布莱恩

20

最简单的方法:

var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'

18

这是我实现的目标:

var appVar = [[]];
appVar[0][4] = "bineesh";
appVar[0][5] = "kumar";
console.log(appVar[0][4] + appVar[0][5]);
console.log(appVar);

这叫我bineeshkumar


2
注意如何只能访问父数组的0索引。这不像允许您设置的东西有用,例如,appVar [5] [9] = 10; ...这样您将获得“无法设置未定义的属性“ 9””。
RaisinBranCrunch

但是appVar[1][4] = "bineesh";错了,怎么解决呢?
甘克18'May

16

二维数组的创建方式与一维数组相同。您可以像这样访问它们array[0][1]

var arr = [1, 2, [3, 4], 5];

alert (arr[2][1]); //alerts "4"

14

我不确定是否有人回答过这个问题,但是我发现这对我很有效-

var array = [[,],[,]]

例如:

var a = [[1,2],[3,4]]

例如,对于二维数组。


如何动态执行此操作?我想要具有不同大小的内部数组。
2014年

3
您不需要多余的逗号var array = [[],[]]就足够了。
卡亚吐司

13

要在javaScript中创建2D数组,我们可以先创建一个Array,然后添加Arrays作为其元素。此方法将返回具有给定行数和列数的2D数组。

function Create2DArray(rows,columns) {
   var x = new Array(rows);
   for (var i = 0; i < rows; i++) {
       x[i] = new Array(columns);
   }
   return x;
}

要创建数组,请使用以下方法。

var array = Create2DArray(10,20);

2
请向您的回答者添加一些解释性信息,以说明其工作原理以及解决问题的原因。这将有助于其他在以后找到此页面的

什么时候需要用Javascript中的某些列预先初始化的Array?您也可以访问[]数组的第n个元素。
domenukk 2014年

我注意到该函数以大写字母C开头,(按某些约定)建议该函数为Function构造函数,并且您可以将其与new关键字一起使用。也许是一个很小的问题,但有些自以为是,但我还是建议不要使用大写字母。
Hachi

12

要创建一个所有索引都可寻址且值设置为null的非稀疏“ 2D”数组(x,y):

let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 

奖励“ 3D”数组(x,y,z)

let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))

在评论中以及针对此问题的不同地方都提到了对此的各种更改和更正,但并未作为实际答案,因此在此添加。

应该注意的是(类似于大多数其他答案),这具有O(x * y)的时间复杂度,因此它可能不适合非常大的数组。


1
请注意,因为fill设置了相同的值。如果更改null为`object,则它在每一列中都是相同的对象
Stanislav Mayorov '19

@StanislavMayorov如果要设置每个单元格的值,请使用相同的技巧:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam

10

使用数组推导

在JavaScript 1.7和更高版本中,您可以使用数组推导来创建二维数组。您也可以在填充数组时过滤和/或操作条目,而不必使用循环。

var rows = [1, 2, 3];
var cols = ["a", "b", "c", "d"];

var grid = [ for (r of rows) [ for (c of cols) r+c ] ];

/* 
         grid = [
            ["1a","1b","1c","1d"],
            ["2a","2b","2c","2d"],
            ["3a","3b","3c","3d"]
         ]
*/

您可以创建所需的任何n x m数组,并通过调用以下方法将其填充为默认值

var default = 0;  // your 2d array will be filled with this value
var n_dim = 2;
var m_dim = 7; 

var arr = [ for (n of Array(n_dim)) [ for (m of Array(m_dim) default ]] 
/* 
         arr = [
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
         ]
*/

此处可以找到更多示例和文档。

请注意,这不是标准功能


快速的Google检查在这里... for是的... 语句仍然是一个循环...
Pimp Trizkit

1
任何浏览器都不支持它-在这里
卡米尔·基茨屈斯基

10

对于一个班轮爱好者来说Array.from()

// creates 8x8 array filed with "0"    
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"))

另一个(来自dmitry_romanov的评论)使用Array()。fill()

// creates 8x8 array filed with "0"    
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"))

使用ES6 + 传播算子(由InspiredJW 回答 “启发” :))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))

2
我们可以删除0第一个fill()函数:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li

8

我的方法与@Bineesh答案非常相似,但具有更通用的方法。

您可以声明double数组,如下所示:

var myDoubleArray = [[]];

并以以下方式存储和访问内容:

var testArray1 = [9,8]
var testArray2 = [3,5,7,9,10]
var testArray3 = {"test":123}
var index = 0;

myDoubleArray[index++] = testArray1;
myDoubleArray[index++] = testArray2;
myDoubleArray[index++] = testArray3;

console.log(myDoubleArray[0],myDoubleArray[1][3], myDoubleArray[2]['test'],) 

这将打印预期的输出

[ 9, 8 ] 9 123

7

我发现下面是最简单的方法:

var array1 = [[]];   
array1[0][100] = 5; 

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);

array1[1][100] = 666;Uncaught TypeError: Cannot set property '100' of undefined
KamilKiełczewski

@KamilKiełczewski你是正确的,看起来这仅对第一个数组数组发起,对于第二个数组,在您这样做之前array1[1][100] = 666;,您需要这样做array1[1] = [];
GMsoF

7

性能

今天,2020.02.05我针对选定的解决方案在Chrome v79.0,Safari v13.0.4和Firefox v72.0的MacOs HighSierra 10.13.6上执行测试。

未初始化的二维数组的结论

  • 深奥的解决方案{}/arr[[i,j]](N)对于大型阵列和小型阵列最快,看起来对于大型稀疏阵列是个不错的选择
  • 基于for-[]/while(A,G)的解决方案速度很快,是小型阵列的理想选择。
  • 解决方案for-[](B,C)快速,它们是大型阵列的不错选择
  • 基于Array..map/from/fill(I,J,K,L,M)的解决方案对于小型阵列来说非常慢,而对于大型阵列来说非常快
  • 令人惊讶的是for-Array(n)(B,C)在野生动物园中比for-[](A)慢得多
  • 令人惊讶的for-[]是,大数组在所有浏览器中的速度(A)都很慢
  • 解决方案对于所有浏览器来说,K对于小型阵列来说速度都很慢
  • 对于所有浏览器来说,解决方案A,E,G对于大型阵列的速度都很慢
  • 解决方案M对于所有浏览器上的所有阵列而言最慢

在此处输入图片说明

初始化二维阵列的结论

  • 基于for/while(A,B,C,D,E,G)的解决方案对于所有浏览器上的小型阵列都是最快/非常快的
  • 基于for(A,B,C,E)的解决方案对于所有浏览器上的大型阵列都是最快/非常快的
  • 基于Array..map/from/fill(I,J,K,L,M)的解决方案对于所有浏览器上的小型阵列都是中等快或慢
  • 大阵列的解决方案F,G,H,I,J,K,L在chrome和safari上中等或快速,但在Firefox上最慢。
  • {}/arr[[i,j]]对于所有浏览器而言,深奥解决方案(N)对于大型阵列速度最快

在此处输入图片说明

细节

测试未填充(初始化)输出数组的解决方案

我们测试解决方案的速度

  • 小数组(12元) -您可以在计算机上执行测试HERE
  • 大阵列(1万台)阵列-你可以在你的计算机上执行测试HERE

测试填充(初始化)输出数组的解决方案

我们测试解决方案的速度

  • 小数组(12元) -您可以在计算机上执行测试HERE
  • 大阵列(1万台)阵列-你可以在你的计算机上执行测试HERE

在此处输入图片说明


6

Javascript不支持二维数组,相反,我们将一个数组存储在另一个数组中,然后根据要访问该数组的位置从该数组中获取数据。请记住,数组计算从ZERO开始。

代码示例:

/* Two dimensional array that's 5 x 5 

       C0 C1 C2 C3 C4 
    R0[1][1][1][1][1] 
    R1[1][1][1][1][1] 
    R2[1][1][1][1][1] 
    R3[1][1][1][1][1] 
    R4[1][1][1][1][1] 
*/

var row0 = [1,1,1,1,1],
    row1 = [1,1,1,1,1],
    row2 = [1,1,1,1,1],
    row3 = [1,1,1,1,1],
    row4 = [1,1,1,1,1];

var table = [row0,row1,row2,row3,row4];
console.log(table[0][0]); // Get the first item in the array

6

var playList = [
  ['I Did It My Way', 'Frank Sinatra'],
  ['Respect', 'Aretha Franklin'],
  ['Imagine', 'John Lennon'],
  ['Born to Run', 'Bruce Springsteen'],
  ['Louie Louie', 'The Kingsmen'],
  ['Maybellene', 'Chuck Berry']
];

function print(message) {
  document.write(message);
}

function printSongs( songs ) {
  var listHTML;
  listHTML = '<ol>';
  for ( var i = 0; i < songs.length; i += 1) {
    listHTML += '<li>' + songs[i][0] + ' by ' + songs[i][1] + '</li>';
  }
  listHTML += '</ol>';
  print(listHTML);
}

printSongs(playList);


6

ES6 +,ES2015 +可以用更简单的方式做到这一点


创建3 x 2填充为true的数组

[...Array(3)].map(item => Array(2).fill(true))

我要供认 我“采纳”了您的答案,并将其添加到的一线收藏中。

5

我必须制作一个灵活的数组函数,以便根据需要向其中添加“记录”,并能够对其进行更新并进行所需的任何计算,然后再将其发送到数据库进行进一步处理。这是代码,希望对您有所帮助:)。

function Add2List(clmn1, clmn2, clmn3) {
    aColumns.push(clmn1,clmn2,clmn3); // Creates array with "record"
    aLine.splice(aPos, 0,aColumns);  // Inserts new "record" at position aPos in main array
    aColumns = [];    // Resets temporary array
    aPos++ // Increments position not to overlap previous "records"
}

随时优化和/或指出任何错误:)


怎么样aLine.push([clmn1, clmn2, clmn3]);
皮条客Trizkit

5

我发现这是制作二维数组的一种快速方法。

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(e => Array(y));
}

您也可以轻松地将此功能转换为ES5功能。

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(function(e) {
        return Array(y);
    });
}

为何起作用:new Array(n)构造函数创建一个原型Array.prototype为的对象,然后分配该对象的length,从而导致未填充的数组。由于缺少实际成员,因此我们无法在其Array.prototype.map上运行该功能。

但是,当您向构造函数提供多个参数时(例如,当您提供时)Array(1, 2, 3, 4),构造函数将使用该对象正确地arguments实例化并填充一个Array对象。

因此,我们可以使用Array.apply(null, Array(x)),因为该apply函数会将参数传播到构造函数中。为了澄清起见,做Array.apply(null, Array(3))等同于做Array(null, null, null)

现在我们已经创建了一个实际的填充数组,我们所需要做的就是调用map并创建第二层(y)。


5

在下方,创建一个5x5矩阵并填充 null

var md = [];
for(var i=0; i<5; i++) {
    md.push(new Array(5).fill(null));
}

console.log(md);


3
这个答案是错误的。它将创建一个阵列,并在其插槽中填充相同的阵列。md[1][0] = 3 和元素的所有其余的也更新了

5

只有在运行时才知道数组的大小,然后可以使用以下方法创建动态2d数组

var num = '123456';
var row = 3; // Known at run time
var col = 2; // Known at run time
var i = 0;

var array2D = [[]];
for(var r = 0; r < row; ++r)
{
    array2D[r] = [];
    for(var c = 0; c < col; ++c)
    {
        array2D[r][c] = num[i++];
    }
}
console.log(array2D); 
// [[ '1', '2' ], 
//  [ '3', '4' ], 
//  [ '5', '6' ]]

console.log(array2D[2][1]); // 6

4

还有另一种解决方案,它不强迫您预先定义2d数组的大小,这非常简洁。

var table = {}
table[[1,2]] = 3 // Notice the double [[ and ]]
console.log(table[[1,2]]) // -> 3

之所以起作用,[1,2]是因为将其转换为字符串,该字符串用作table对象的字符串键


仅此一个答案就使我不想惹上JavaScript中“多维”数组的垃圾,即使我有一个非常优雅的解决方案。这也说明了其他所有人实际上并不是在制作多维数组。 JavaScript中的“数组”;此答案将完全“模拟”具有任意大小和内容的伪无限大小,无限维数组。所有其他基于递归和循环的答案对它们可以创建的数组结构的大小的上限要低得多。对于这些较大的结构,速度将是一个主要问题。
Pimp Trizkit

请改用此行来模拟预填充:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit,

一种通过对象“模拟” Array2D的好方法:)
KamilKiełczewski

4

要创建4x6阵列,只需执行此操作

const x = [...Array(6)].map(elem => new Array(4))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.