我在网上看到一些地方说JavaScript不能声明二维数组,有些则给出了一个例子并称可以,还有其他人驳斥这个例子等等。
如何在JavaScript中声明一个二维数组?(假设它是可能的)
如何访问它的成员?(
myArray[0][1]
还是myArray[0,1]
?)
我在网上看到一些地方说JavaScript不能声明二维数组,有些则给出了一个例子并称可以,还有其他人驳斥这个例子等等。
如何在JavaScript中声明一个二维数组?(假设它是可能的)
如何访问它的成员?(myArray[0][1]
还是 myArray[0,1]
?)
Practically? Yes. You can create an array of arrays which functions as an 2D array as every item is an array itself:
let 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);
但从技术上讲,这只是一个数组的数组,而不是“真正”的二维数组,正如I. J. Kennedy指出的那样。
需要注意的是,您可以将数组嵌套到彼此中,从而创建“多维”数组。
var x = new Array(10);
for (var i = 0; i < x.length; i++) {
x[i] = new Array(3);
}
console.log(x);
new Array(size)
,其中 size
是一个变量。 - Variadicism和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)]
var array = createArray(2, 3, 4, 5);
。 - Matthew Crumley[[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]],[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]]]
- bb216b3acfd8f72cbc8f899d4d6963Array.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
。请记住,Array
将不会分配位置,直到您通过.fill
或直接值分配命令它为止。
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]);
Array.from({length:5}, () => [])
,意思是创建一个长度为5的空数组。 - vsyncArray.from(Array(2), () => new Array(4))
和Array.from(Array(2), () => Array(4))
有什么区别? - Owen YoungJavascript只有一维数组,但可以构建二维数组,正如其他人指出的那样。
以下函数可用于构建固定尺寸的二维数组:
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 = [[]];
myArray[1][0]
赋值为5之前,您需要先设置myArray[1]=[];
。请注意,不要改变原来的意思。 - 182764125216myArray.length == 1
和 myArray[0].length == 0
。如果你将一个“真正空的”“0x0”数组复制到其中,就会得到错误的结果。 - JonBrave一些人认为不可能是因为二维数组实际上只是一个数组的数组。这里提供的其他评论都提供了在JavaScript中创建二维数组的完全有效的方法,但最纯粹的观点是您有一个对象的一维数组,每个对象都是由两个元素组成的一维数组。
因此,这就是产生冲突的观点的原因。
string[3,5] = "foo";
。对于某些情况来说,这是一种更好的方法,因为Y轴实际上不是X轴的子集。 - rafasoares很少有人展示使用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
for
(它设置默认值),并写下了 m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));
- 我们得到了一个非常奇怪的矩阵(嵌套太多)- 你在最后一个 for-defaultValue 步骤中修复了它,但我认为你可以重写程序,在设置默认值之前使用更少的嵌套数组。 - Kamil Kiełczewski两行诗:
var a = [];
while(a.push([]) < 10);
它将生成长度为10的数组a,其中填充有数组。 (push会向数组添加元素并返回新的长度)
var
的工作原理。它始终是函数作用域。 - Bergivar 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);
// 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);
Array.apply(null, Array(nrows))
做了类似的事情,但这个更加优雅。 - dimiguelfill
。这在大多数浏览器上都无法工作。 - dimiguelFill
: Array(nrows).map(() => 0)
或Array(nrows).map(function(){ return 0; });
。 - Conor O'Brien
var arr2D = new Array(5).fill(new Array(3));
将一个数组填充了更多的数组时,Array(5) 的每个元素都会指向同一个Array(3)。因此最好使用for循环动态地填充子数组。 - Josh Striblinga = Array(5).fill(0).map(x => Array(10).fill(0))
- Longfei Wufill
函数不会为要填充的数组的每个索引调用new Array(3)
,因为它不是 Lambda 表达式或任何其他东西,比如 Longfei Wu 在上面的评论中,它最初使用 0 填充数组,然后使用 map 函数和 Lambda 来填充每个元素为新数组。fill 函数只是简单地根据你告诉它的内容来填充数组。这讲得通吗?有关map
函数的更多信息,请参见:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map - Josh Stribling如果新问题更好或有更好的答案,则将旧问题标记为新问题的重复。
- Adam