如何在 JavaScript 中创建二维数组?

我一直在网上阅读,有些地方说这是不可能的,有些地方说是不可能,然后举一个例子,其他人则反驳该例子,等等。

  1. 如何在 JavaScript 中声明二维数组? (假设有可能)

  2. 我将如何访问其成员? ( 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 数组。


或者(但效率低 12%, 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);