45

如何在 Javascript 中创建一个空的二维数组(不知道新数组中有多少行或列)?

如果它是一个简单的数组var newArray = new Array();,我可以分配任意数量的元素。但是二维数组呢?我可以在不指定行数和列数的情况下创建一个吗?以及之后如何访问元素(myArray[0][1]myArray[0,1])?

4

10 回答 10

85

您可以像这样创建一个 6 x 6 的空数组:

var myGrid = [...Array(6)].map(e => Array(6));
  • Array(6)生成一个长度 = 6 且充满undefined值的数组。
  • 我们将该数组映射到另一个充满undefined值的数组。
  • 最后,我们得到一个充满undefined位置的 6x6 网格。

如果您需要使用默认值初始化网格:

var value = 'foo'; // by default
var myGrid = [...Array(6)].map(e => Array(6).fill(value));

现在您有一个 6 x 6 的网格,其中包含'foo'.

于 2016-07-05T21:28:45.737 回答
33

是的,您可以创建一个空数组,然后将数据推送到其中。JavaScript 中不需要先定义长度。
查看jsFiddle 现场演示

定义:

var arr = [[],[]];

推送数据:

arr[0][2] = 'Hi Mr.A';
arr[1][3] = 'Hi Mr.B';

读取数据:

alert(arr[0][2]);
alert(arr[1][3]);


更新

这也是Brady Dowling推荐的视频:
创建 2D 数组

于 2013-05-12T21:29:52.533 回答
14

Javascript 中没有二维数组。

为了实现二维数组的效果,你使用数组数组,也称为锯齿数组(因为内部数组可以有不同的长度)。

像任何其他空数组一样创建一个空的锯齿状数组:

var myArray = new Array();

您还可以使用空数组文字:

var myArray = [];

要将任何项目放入锯齿状数组中,首先必须将内部数组放入其中,例如:

myArray.push([]);
myArray[0][0] = 'hello';

您还可以从一开始就创建一个包含许多空数组的数组:

var myArray = [[],[],[]];

这为您提供了一个没有任何项目的锯齿状数组,但它是由三个内部数组准备的。

由于它是一个数组数组,因此您可以使用myArray[0][1].

于 2013-05-12T21:29:39.977 回答
13

假设您想制作一个 100x100 的二维数组(即矩阵),您可以在一行中完成,如下所示:

var 2darray = new Array(100).fill(null).map(()=>new Array(100).fill(null));

这将创建一个 100x100 的 NULL 矩阵。将 100x100 替换为您想要的任何尺寸,将 null 替换为您喜欢的默认值,或者为未定义的空白替换。

于 2017-04-05T04:49:55.710 回答
3

您可以使用简单的 for 循环来创建近似大小的数组,然后在需要时推送更多行。

const arr = [];
const n = 7;
const m = 5;

for (let i = 0; i < n; i++) {
    arr.push(new Array(m).fill(0));
}

const arr = [];
const n = 7;
const m = 5;

for (let i = 0; i < n; i++) {
    arr.push(new Array(m).fill(0));
}

console.log(arr);

于 2021-08-23T17:25:48.083 回答
2
var myArray = [
    ["cats","dogs","monkeys","horses"],
    ["apples","oranges","pears","bananas"]
];
document.write(myArray[0][2]) //returns "monkeys"
于 2013-05-12T21:53:07.787 回答
2

两件事情:

1) 如果在 var myArray = [[],[]]; 之后调用,数组长度属性会错误地报告数组长度 陈述。从技术上讲,由于定义了空数组,它们被长度属性计数,但根据长度属性的精神,它确实应该返回 0,因为没有向任何数组添加非空元素。

一个最小的解决方法是使用两个嵌套的 for(in) 循环,一个用于第一个数组,一个用于第二个数组,并计算未定义的元素。

2) 扩展 Siamak A.Motlagh 示例并添加 arr([2][4]) = 'Hi Mr.C'; 分配失败并出现“未捕获的类型错误:无法设置未定义的属性 '4'”错误。

请参阅 jsFiddle:http: //jsfiddle.net/howardb1/zq8oL2ds/

这是该代码的副本:

var arr = [[],[]];

alert( arr.length );  // wrong!

var c = 0;
for( var i in arr )
  for( var j in arr[ i ] )
    if( arr[ i ][ j ] != undefined )
      ++c;
alert( c );  // correct

arr[0][2] = 'Hi Mr.A';
alert(arr[0][2]);

arr[1][3] = 'Hi Mr.B';
alert(arr[1][3]);

arr[2][4] = 'Hi Mr.C';  // At this point I'm getting VM558:62 Uncaught TypeError: Cannot set property '4' of undefined
alert(arr[2][4]);

var c = 0;
for( var i in arr )
  for( var j in arr[ i ] )
    if( arr[ i ][ j ] != undefined )
      ++c;
alert( c );

为什么第三次分配失败?[[],[]] 创建语句告诉它第一个数组对 0 和 1 有效,但对 2 无效,或者 2 和 3 对第二个数组有效,但对 4 无效?

最重要的是,我将如何在可以在第一个和第二个数组中保存日期对象的数组中定义一个数组。我正在使用 jQuery-UI DatePicker,它需要一个日期数组,就像在日期对象中一样,我已经扩展为使用第二个日期数组来包含包含时间的日期对象,这样我就可以跟踪多个日期,并且每天多次。

谢谢。

于 2016-09-22T12:48:57.257 回答
1

我使用的功能

function get_empty_2d_array(numRows, numColumnns) {
  return [...Array(numRows)].map(e => Array(numColumnns));
}

function get_2d_array_filled(numRows, numColumnns, fillValue) {
  return [...Array(numRows)].map(e => Array(numColumnns).fill(fillValue));
}
于 2021-03-07T10:09:01.930 回答
0

这也可以用作表达式:

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

我不知道它在性能方面如何与此处的其他答案相提并论,如果您有任何线索,请在评论中告诉我。

如果您事先不知道数组的长度,请记住您可以使用其中之一push([]),或者splice()如果您想推送/删除/替换一个新元素来代替现有元素。

于 2017-06-26T22:16:10.630 回答
0
const grid = new Array(n).fill(new Array(n))
于 2020-04-25T18:40:59.333 回答