我一直在网上阅读,一些地方说这是不可能的,一些地方说这是可能的,然后给出一个例子,另一些地方反驳这个例子,等等。
如何在JavaScript中声明一个2维数组?(假设这是可能的) 我如何访问它的成员?(myArray[0][1] or myArray[0,1]?)
我一直在网上阅读,一些地方说这是不可能的,一些地方说这是可能的,然后给出一个例子,另一些地方反驳这个例子,等等。
如何在JavaScript中声明一个2维数组?(假设这是可能的) 我如何访问它的成员?(myArray[0][1] or myArray[0,1]?)
当前回答
var _field = (function()
{
var array = [];
for(var y = 0; y != 3; y++) { array[y] = new Array(5); }
return array;
})();
// var item = _field[2][4];
其他回答
实际上呢?是的。你可以创建一个数组的数组,作为一个2D数组,因为每个项目本身就是一个数组: Let items = [ (1、2), (3、4), (5、6) ]; console.log(项目[0][0]);/ / 1 console.log(项目[0][1]);/ / 2 console.log(项目[1][0]);/ / 3 console.log(项目[1][1]);/ / 4 console.log(项目);
但从技术上讲,这只是一个数组的数组,而不是一个“真正的”2D数组,正如I. J. Kennedy指出的那样。
需要注意的是,您可以将数组嵌套到另一个数组中,从而创建“多维”数组。
一行代码创建一个m*n的二维数组,数组中填充0。
new Array(m).fill(new Array(n).fill(0));
我修改了Matthew Crumley关于创建多维数组函数的回答。我已经添加了要作为数组变量传递的数组的维度,还有另一个变量- value,它将用于设置多维数组中最后一个数组的元素的值。
/*
* Function to create an n-dimensional array
*
* @param array dimensions
* @param any type value
*
* @return array array
*/
function createArray(dimensions, value) {
// Create new array
var array = new Array(dimensions[0] || 0);
var i = dimensions[0];
// If dimensions array's length is bigger than 1
// we start creating arrays in the array elements with recursions
// to achieve multidimensional array
if (dimensions.length > 1) {
// Remove the first value from the array
var args = Array.prototype.slice.call(dimensions, 1);
// For each index in the created array create a new array with recursion
while(i--) {
array[dimensions[0]-1 - i] = createArray(args, value);
}
// If there is only one element left in the dimensions array
// assign value to each of the new array's elements if value is set as param
} else {
if (typeof value !== 'undefined') {
while(i--) {
array[dimensions[0]-1 - i] = value;
}
}
}
return array;
}
createArray([]); // [] or new Array()
createArray([2], 'empty'); // ['empty', 'empty']
createArray([3, 2], 0); // [[0, 0],
// [0, 0],
// [0, 0]]
如何创建空二维数组(一行)
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时效率更低,为12%)
Array(2).fill(null).map(() => Array(4))
性能下降的原因是我们必须初始化第一个维度的值才能运行.map。记住,数组不会分配位置,直到你通过.fill或直接赋值对它进行排序。
var arr =阵列(2).fill (null) . map(() = >阵列(4)); Arr [0][0] = 'foo'; console.info (arr);
跟进
这里有一个方法看起来是正确的,但有问题。
Array(2).fill(Array(4)); // BAD! Rows are copied by reference
虽然它确实返回了显然需要的二维数组([[<4空项>],[<4空项>]]),但有一个问题:一维数组是通过引用复制的。这意味着arr[0][0] = 'foo'实际上会改变两行而不是一行。
var arr =数组(2).fill(数组(4)); Arr [0][0] = 'foo'; console.info (arr); console.info (arr [0] [0], arr [1] [0]);
还有另一种解决方案,它不强迫你预先定义2d数组的大小,而且非常简洁。
Var表= {} table[[1,2]] = 3 //注意双[[and]] Console.log (table[[1,2]]) // -> 3 .单击“确定”
这是因为,[1,2]被转换为一个字符串,用作表对象的字符串键。