我在使用新Array.prototype.fill
方法遇到问题,因为与Array.prototype.map
一起使用时出现意外输出。例如:
// Initialize our n x n matrix and fill with 0's
let M = Array(3).fill(Array(3).fill(0));
M.map(function (row, i) {
row[i] = i;
return row;
}); //=> [[0, 1, 2], [0, 1, 2], [0, 1, 2]]
在上面的例子中,我希望输出与下面的例子相同:
let M = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
M.map(function (row, i) {
row[i] = i;
return row;
}); //=> [[0, 0, 0], [0, 1, 0], [0, 0, 2]]
然而,它并非如此。由于某种原因,在第一个示例中返回的结果将被用作下一次迭代中的行值。有什么想法可能会发生吗?我使用6to5ify变换进行浏览器化,将ES6代码转换为ES5。
答案 0 :(得分:1)
您的代码相当于:
let inner = Array(3).fill(0);
let M = Array(3).fill(inner);
当您将inner
传递给.fill()
时,它不会复制它,M
数组包含对同一数组的3个引用。所以你对M
的一个元素所做的任何事情都会发生在他们身上。
您需要为M
的每个元素创建新数组:
let M = [];
for (var i = 0; i < 3; i++) {
M.push(Array(3).fill(0));
}