如何在javascript中创建一个二维零数组?

25

有没有一种简单的方法在javascript中编程创建一个二维数组?

我不想要什么:

var array2D = [ 
  [0,0,0],
  [0,0,0],
  [0,0,0]
]
5个回答

75

解决方案 2017:

虽然晚了一步,但是这篇帖子仍然在Google搜索结果中排名靠前。

要创建一个给定大小的2D数组(可适用于更多维度),请使用以下方法:

let array = Array(rows).fill().map(() => Array(columns));

预填充的二维数组:

let array = Array(rows).fill().map(() => Array(columns).fill(0));

例如:

Array(2).fill().map(() => Array(3).fill(42));
// Result:
// [[42, 42, 42],
//  [42, 42, 42]]

警告:

Array(rows).fill(Array(columns))会导致所有行都引用同一个数组!


2018年9月24日更新(感谢@Tyler):

另一种可能的方法是使用Array.fill()应用映射函数。

例如:

Array.from(Array(2), _ => Array(3).fill(43));
// Result:
// [[43, 43, 43],
//  [43, 43, 43]]

基准测试:

https://jsperf.com/multi-dimensional-array-map-vs-fill/5


1
不错的回答。使用 Array.from({ length: rows }, () => Array(columns).fill(value)); 而不是 Array.from(Array(rows), _ => Array(columns).fill(value)); 可以避免创建空数组。但我不确定哪个更快。 - Robbendebiene
1
Richard Natal很好心地为我更新了jsperf测试,所以我只需要更新jsperf链接。对我来说,[...Array(1000)].map(e => Array(1000).fill(0));方法是最快的,紧随其后的是for循环变体。 - FatalMerlin

14

好的,你可以编写一个帮助函数:

function zeros(dimensions) {
    var array = [];

    for (var i = 0; i < dimensions[0]; ++i) {
        array.push(dimensions.length == 1 ? 0 : zeros(dimensions.slice(1)));
    }

    return array;
}

> zeros([5, 3]);
  [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

奖励:可处理任意维数。


将“item”更改为一个lambda,该lambda是项目的工厂。 - Ates Goral
2
这段代码可以写得更清晰一些。通常在编写递归函数时,您应确保基本情况和归纳情况易于识别。在上面的代码中,两者都在同一行上 - 非常令人困惑。相反,我建议您在函数顶部检查 dimensions.length === 1 条件,并创建两个 for 循环 - 一个用于创建一个由 0 组成的数组(基本情况),另一个则通过调用 zeros 函数创建一个数组(归纳情况)。虽然生成的代码可能会更冗长,但却不那么令人困惑。 - Xavi

10

你可以使用以下函数创建一个二维零数组

const zeros = (m, n) => [...Array(m)].map(e => Array(n).fill(0));

console.log(zeros(3, 4));

// [ [ 0, 0, 0, 0 ],
//   [ 0, 0, 0, 0 ],
//   [ 0, 0, 0, 0 ] ]


9
function zero2D(rows, cols) {
  var array = [], row = [];
  while (cols--) row.push(0);
  while (rows--) array.push(row.slice());
  return array;
}

4
一个适合初学者的简单易懂的基础方法:
function twoDarrMaker(row, col) {
  const twoDarr = [];

  for (let i = 0; i < row; i++) {
    let subarray = [];

    for (let j = 0; j < col; j++) {
      subarray.push(0);
    }

    twoDarr.push(subarray);
  }

  return twoDarr;
}

twoDarrMaker(3, 2);
// [
//   [ 0, 0 ],
//   [ 0, 0 ],
//   [ 0, 0 ]
// ]

编辑:这是我的代码解释。你需要创建一个数组 twoDArr,用于保存2D数组或者数组的数组。使用外部for循环来创建子数组。然后使用内部for循环向子数组添加零。然后将子数组添加到外部数组 twoDarr 中。然后根据外部for循环指定的次数重复此过程。当外部for循环完成时,返回2D数组。

基本上,外部for循环创建了行(子数组),而内部for循环创建了列(子数组中的元素)。外部for循环告诉您通过重复块中的代码 x 次来创建 x 行(子数组),而内部for循环则告诉您通过重复块中的代码 y 次来创建 y 列(元素)。


请不要在回答中只贴代码而没有解释。尽量解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Zsolt Meszaros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接