Array.fill(Array)通过引用而不是值来创建副本

Cri*_*sty 14 javascript reference ecmascript-6

我正在尝试创建一个6乘12矩阵 Array.fill

let m = Array(6).fill(Array(12).fill(0));
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但问题是内部数组实际上都引用了同一个Array对象.

let m = Array(6).fill(Array(12).fill(0));
m[0][0] = 1;
console.log(m[1][0]); // Outputs 1 instead of 0
Run Code Online (Sandbox Code Playgroud)

我想(和预期)的值m[1][0]0.

如何强制Array.fill填充给定参数的值复制(例如:Array(12).fill(0)在我的情况下是参数)而不是通过引用复制?

Kev*_*Bot 12

您可以使用Array.from()代替:

感谢Pranav C Balan在评论中提出的关于进一步改善此问题的建议。

let m = Array.from({length: 6}, e => Array(12).fill(0));

m[0][0] = 1;
console.log(m[0][0]); // Expecting 1
console.log(m[0][1]); // Expecting 0
console.log(m[1][0]); // Expecting 0
Run Code Online (Sandbox Code Playgroud)


原始声明(上面进行了优化):

let m = Array.from({length: 6}, e => Array.from({length: 12}, e => 0));
Run Code Online (Sandbox Code Playgroud)


Poi*_*nty 6

你不能用.fill(),但你可以用.map()

let m = new Array(6).map(function() { return new Array(12); });
Run Code Online (Sandbox Code Playgroud)

编辑哦,等等,这行不通;.map()不会遍历未初始化的元素。你可以先填写:

let m = new Array(6).fill(null).map(function() { return new Array(12); });
Run Code Online (Sandbox Code Playgroud)

  • 你们这些有新语言功能的孩子需要离开我的草坪 (5认同)
  • 你可以做`[...Array(6)].map(() => Array(12).fill(0))` (2认同)
  • @Pointy:无论如何,我认为 `Array.from(Array(6)).map(...)` 比那个丑陋的扩展运算符更具可读性:-) (2认同)