在用数组填充初始化的数组上使用数组映射的意外行为
Unexpected behavior using Array Map on an Array Initialized with Array Fill
由于与Array.prototype.map
一起使用时意外输出,我在使用新Array.prototype.fill
方法时遇到了问题。例如:
// 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。
您的代码等效于:
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));
}
相关文章:
- 意外结果,在 ASP.Net 中解析 JSON 对象的数组
- Javascript 数组反向函数意外行为
- 使用变量初始化数组:意外的令牌 +
- 在 JS 中短路空数组会产生意外结果:“[] ||真 == []'
- 推入数组会产生意外的结果
- JavaScript在数组内迭代数组的意外行为
- JavaScript数组-意外的令牌
- JavaScript:推送到空数组中的意外行为
- 意外的类型错误 - Javascript,多维数组
- 在用数组填充初始化的数组上使用数组映射的意外行为
- 切换句柄多维数组.意外结果
- 随后的多维数组排序会产生意外的结果
- 将数组项用作对象中的键时出现意外的令牌错误
- 从数组中拼接出意外的元素
- JavaScript中2D数组的值发生意外更改
- JavaScript 二维数组填充中的意外输出
- 将字段插入子文档数组中.意外行为
- AngularJS分析JSON数组对象意外的令牌:
- 意外标记d'当尝试将对象添加到Javascript对象数组时
- 传递对象数组-意外令牌[