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

时间:2016-06-21 16:26:48

标签: javascript reference ecmascript-6

我正在尝试使用Array.fill

创建一个6乘12的矩阵
let m = Array(6).fill(Array(12).fill(0));

虽然这有效,但问题是内部数组实际上都是引用相同的Array对象。

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

我希望(并期望)m[1][0]的值为0

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

3 个答案:

答案 0 :(得分:6)

您可以改为使用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




原始声明(上面更好地优化):

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

答案 1 :(得分:2)

您无法使用.fill()执行此操作,但可以使用.map()

let m = new Array(6).map(function() { return new Array(12); });

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

let m = new Array(6).fill(null).map(function() { return new Array(12); });

答案 2 :(得分:2)

您无法使用 Array#fill 方法执行此操作。而是迭代数组并使用for循环添加新创建的数组。

let m = Array(6);
for (var i = 0; i < m.length; i++)
  m[i] = Array(12).fill(0)

m[0][0] = 1;
console.log(m[1][0]);