我一直在网上阅读,一些地方说这是不可能的,一些地方说这是可能的,然后给出一个例子,另一些地方反驳这个例子,等等。

如何在JavaScript中声明一个2维数组?(假设这是可能的) 我如何访问它的成员?(myArray[0][1] or myArray[0,1]?)


当前回答

最简单的方法:

var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'

其他回答

类似于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)]

创建一个非稀疏的“2D”数组(x,y),所有的索引都是可寻址的,并且值设置为空:

let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 

“3D”数组(x,y,z)

let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))

关于这个问题的变化和更正已经在评论中提到,并在不同的地方回应了这个问题,但不是一个实际的答案,所以我在这里添加了它。

应该注意的是(类似于大多数其他答案),这有O(x*y)时间复杂度,所以它可能不适合非常大的数组。

只需将数组中的每个项设置为数组。

var x = new Array(10); For (var I = 0;I < x.length;我+ +){ x[i] = new Array(3); } console.log (x);

如果你想要的是一个4x4矩阵,看看DOMMatrix,它很容易使用,我可以说,

let m = new DOMMatrix(); 
// m.m11, m.m12, m.m13, m.m14, ..., m.m41, m.m42, m.m43, m.m44

最初由于不同的原因,它在node.js上不可用,并且仅限于4x4。

你也可以考虑使用一个自动激活对象,而不是JS的数组,看看我的答案,但这里也带来了更多的说服力:

var tree = () => new Proxy({}, { get: (target, name) => name in target ? target[name] : target[name] = tree() });

var t = tree();
t[0][2][3] = 4;
console.log(t[0][2][3]);

它使用新的JS和行为不正确时,你迭代它,所以要小心它。

如果你需要一个灵活的多维数组生成器,也可以看看这个。

如何创建空二维数组(一行)

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]);