如何在Javascript中创建一个空的2D数组(不知道新数组中会有多少行或列)?
如果它是一个简单的数组var newArray = new Array();
,我可以根据需要分配尽可能多的元素。但是2D阵列怎么样?我可以创建一个而不指定行数和列数吗?以及如何在之后访问元素(myArray[0][1]
或myArray[0,1]
)?
答案 0 :(得分:40)
你可以像这样创建一个6 x 6的空数组:
var myGrid = [...Array(6)].map(e => Array(6));
Array(6)
生成一个长度为6且且值为undefined
的数组。undefined
值的数组。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));
}