我一直在网上阅读,有些地方说这是不可能的,有些地方说是不可能,然后举一个例子,其他人则反驳该例子,等等。
如何在 JavaScript 中声明二维数组? (假设有可能)
我将如何访问其成员? ( myArray[0][1]
或myArray[0,1]
吗?)
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);
您只需将数组中的每个项目都设为一个数组。
var x = new Array(10);
for (var i = 0; i < x.length; i++) {
x[i] = new Array(3);
}
console.log(x);
与 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)]
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;
// ...
最简单的方法:
var myArray = [[]];
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 数组。
n = 10,000
) Array(2).fill(null).map(() => Array(4))
性能下降的事实是,我们必须将第一个维度值初始化为运行.map
。请记住,除非您通过.fill
或直接值分配对其进行排序,否则Array
不会分配位置。
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> ] ]
),但有一个问题:第一维数组已通过引用复制。这意味着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]);
有人说不可能的原因是因为二维数组实际上只是数组的数组。这里的其他注释提供了在 JavaScript 中创建二维数组的完全有效的方法,但最纯粹的观点是您拥有一个一维对象数组,每个对象都是一个由两个元素组成的一维数组。
因此,这就是观点冲突的原因。
很少有人展示出 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
两线:
var a = [];
while(a.push([]) < 10);
它将生成一个长度为 10 的数组,并用数组填充。 (将元素添加到数组中并返回新的长度)
最明智的答案似乎是
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);