如何在javascript中创建空的2d数组?

时间:2013-05-12 21:23:20

标签: javascript

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

如果它是一个简单的数组var newArray = new Array();,我可以根据需要分配尽可能多的元素。但是2D阵列怎么样?我可以创建一个而不指定行数和列数吗?以及如何在之后访问元素(myArray[0][1]myArray[0,1])?

9 个答案:

答案 0 :(得分:40)

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

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

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

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

现在你有一个6 x 6网格的'foo'

答案 1 :(得分:21)

是的,您可以创建一个空数组,然后将数据推入其中。无需在JavaScript中首先定义长度。
请查看 jsFiddle Live Demo

定义:

var arr = [[],[]];

推送数据:

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

阅读数据:

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

答案 2 :(得分:12)

Javascript中没有二维数组。

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

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

var myArray = new Array();

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

var myArray = [];

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

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

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

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

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

由于它是一个数组数组,您可以使用myArray[0][1]访问项目。

答案 3 :(得分:8)

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

//2d matrix in one line var 2darray = new Array(100).fill(null).map(()=>new Array(100).fill(null));

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

答案 4 :(得分:2)

var myArray = [
    ["cats","dogs","monkeys","horses"],
    ["apples","oranges","pears","bananas"]
];
document.write(myArray[0][2]) //returns "monkeys"

答案 5 :(得分:1)

两件事:

1)如果在var myArray = [[],[]]之后调用,则数组长度属性不正确地报告数组长度;声明。从技术上讲,由于定义了空数组,因此它们会被length属性计算,但是在length属性的精神中它确实应该返回0,因为没有任何非空元素被添加到任何数组中。

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

2)扩展Siamak A.Motlagh示例并添加arr([2] [4])=' Hi Mr.C&#39 ;;分配失败,带有"未捕获的TypeError:无法设置属性' 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个?

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

感谢。

答案 6 :(得分:0)

这也可以用作表达式:

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

如果您有任何线索,请在评论中告诉我,我不知道如何根据性能与其他答案进行对比。

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

答案 7 :(得分:0)

my_static_int cannot be resolved or is not a field

答案 8 :(得分:0)

我使用的功能

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