我该如何在Javascript中创建一个空的二维数组(不知道新数组会有多少行或列)?
如果是简单的一维数组,var newArray = new Array();
我可以为它分配任意数量的元素。但是对于二维数组呢?我能否创建一个不指定行数和列数的二维数组?之后我该如何访问数组元素 (myArray[0][1]
或 myArray[0,1]
)?
我该如何在Javascript中创建一个空的二维数组(不知道新数组会有多少行或列)?
如果是简单的一维数组,var newArray = new Array();
我可以为它分配任意数量的元素。但是对于二维数组呢?我能否创建一个不指定行数和列数的二维数组?之后我该如何访问数组元素 (myArray[0][1]
或 myArray[0,1]
)?
您可以像这样创建一个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'
。
const create2dArray = (rows, columns) => [...Array(rows).keys()].map(i => Array(columns))
- rkd[...Array(6)]
而不是 Array(6)
的目的是什么? - nog642Array(6)
生成的数组,因为它没有元素,但是通过[...Array(6)]
生成的数组包含了6个未定义的元素,你可以对它们进行迭代/映射。 - Andrémap
函数中不需要使用 e
。你可以使用空括号:.map( () => Array(6).fill(value)
。 - Badrush可以创建一个空的数组,然后向其中添加数据。在JavaScript中,不需要先定义长度。
请查看jsFiddle Live Demo。
const arr = [[],[]];
推送数据:
arr[0][2] = 'Hi Mr.A';
arr[1][3] = 'Hi Mr.B';
读取数据:
alert(arr[0][2]);
alert(arr[1][3]);
更新:
这里还有一段由Brady Dowling推荐的视频:
创建一个二维数组:([https://www.youtube.com/watch?v=tMeDkp1J2OM][2])new Array ()()
? - meksnew Array([])
,查看演示。这个答案解决了你的问题吗? - Siamak MotlaghJavascript中不存在二维数组。
为了实现二维数组的效果,可以使用数组的数组,也称为不规则数组(因为内部数组的长度可以不同)。
创建一个空的不规则数组就像创建任何其他空数组一样:
var myArray = new Array();
您也可以使用一个空数组字面量:
var myArray = [];
要将任何项放入锯齿数组,首先必须将内部数组放入其中,例如像这样:
myArray.push([]);
myArray[0][0] = 'hello';
你也可以创建一个包含一些空数组的数组:
var myArray = [[],[],[]];
这样可以得到一个没有任何项目的锯齿数组,但它已准备好有三个内部数组。
由于它是一个数组的数组,您可以使用myArray[0][1]
访问项目。
假设您想要创建一个100x100的二维数组(即矩阵),您可以通过一行代码完成,如下所示:
var 2darray = new Array(100).fill(null).map(()=>new Array(100).fill(null));
这将创建一个100x100的NULL矩阵。 用您想要的任何维度替换 100 x 100,用您喜欢的默认值或未定义的空白替换 null。
您可以使用简单的`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);
我使用的函数
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));
}
两件事情:
1)在var myArray = [[],[]];语句之后调用数组长度属性会不正确地报告数组长度。 从技术上讲,由于定义了空数组,它们正在被长度属性计算,但是在长度属性的精神下,它确实应该返回0,因为没有向任何数组添加非空元素。
最小的解决方法是使用两个嵌套的for(in)循环,一个用于第一个数组,一个用于第二个数组,并计算非undefined元素的数量。
2)扩展Siamak A.Motlagh的示例并添加arr([2] [4])= 'Hi Mr.C';分配会失败,并出现“Uncaught TypeError:Cannot set property'4' of undefined”错误。
请参见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 );
var myArray = [
["cats","dogs","monkeys","horses"],
["apples","oranges","pears","bananas"]
];
document.write(myArray[0][2]) //returns "monkeys"
这也可以作为一个表达式使用:
var twoDarr= new Array(desiredLength);
for (i=0;i<twoDarr.length;i++) {twoDarr[i]=[];}
关于性能方面,我不知道它与其他答案相比如何。如果你有线索,请在评论中告诉我。
如果您事先不知道数组的长度,请记住可以使用push([])
或splice()
,如果您想要在现有元素的位置上推送/删除/替换新元素。
const grid = new Array(n).fill(new Array(n))
var row_major = Array(height).map(function () { return Array(width); });
可以解决问题,但今天需要一个二维数组时发现它不行。真是让人沮丧。 - Mark K Cowan