ES6中的二维数组

4

长话短说,我正在寻找一种使用ES6创建和填充2D数组的方法,以避免使用for循环。创建的数组应该包含所有0。我尝试了许多不同的方法,所以我不能把它们都贴出来。

var [r, c] = [5, 5]; 
var m = Array(r).fill(Array(c).fill(0));

这段代码能够运行,但它会创建许多相同的数组实例,并加上slice Array(r).fill(Array(c).fill(0).slice());也没有帮助。

我还尝试过创建空数组,然后循环遍历它们,但是那是一个完全不同的问题,显然你不能 forEach() 或者 map() 一个空数组,我甚至无法高效地循环遍历一个填充了值的数组。

我错过了什么吗?难道用许多for循环来处理是最好的方法吗?这看起来非常混乱和过于冗长。任何帮助都将不胜感激。

4个回答

10

以下方法适用于我:

var [r, c] = [5, 5]; 
var m = Array(r).fill().map(()=>Array(c).fill(0));

基本上只是填充一个虚拟值,以便您可以对其进行映射


1
节省一个字节,.fill() :p - Jaromanda X
这个代码可以运行,而且似乎是目前最快的。虽然for循环要快两倍,但我想那不是我问的问题,非常感谢你的回答。 - Mare_413

3
您可以使用带有回调函数的 Array.from,并在内部使用 fill 方法返回具有 0 的数组。

const arr = Array.from(Array(2), () => Array(5).fill(0))
console.log(arr)

或者您可以创建一个数组,其中每个元素都是子数组中元素的数量,然后使用 mapfill 方法。

const arr = [5, 5].map(e => Array(e).fill(0))
console.log(arr)


2
那段第二个代码是不对的,它产生了一个 2 x 5 的数组,而不是 5 x 5。 - Jaromanda X
两者都做 - vityavv
问题要求计算 5 x 5 ... 您的第二段代码中有 [5,5],与问题相同 ... 但是却输出了 2 x 5。 - Jaromanda X
@zevee - 是的,它们两个都是可以做到的.. 但显然第一个答案硬编码了2和5 ... 问题是,题目要求5 x 5。 - Jaromanda X
就我个人而言,我会使用Array.from(Array(r), () => Array(c).fill(0));方法,因为在我看来,它更明显地表达了其意图。 - Jaromanda X
谢谢您的答复,第一个看起来不错,虽然我认为另一个不起作用。 - Mare_413

3

如果需要同样的事情,但每个值都是undefined,也可以使用这个方法。

const x = 100;
const y = 100;
const grid = [...new Array(x)].map(() => [...new Array(y)]);

填充数组只需映射内部的值。 这将创建一个由每个值为0的元素组成的数组。

const x = 100;
const y = 100;
const grid = [...new Array(10)].map(() => [...new Array(10)].map(() => 0));

0

const nthArray = (n) => Array.from(Array(n), () => Array(5).fill(0))

const arr = nthArray(3);

console.log(arr);


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