javascript - Array.fill 和 [...] 之间的行为差异
问题描述
尝试在 Node/Chrome 中生成和使用对称生成的 2D 矩阵时,我遇到了一个奇怪的行为。生成方法如下所示。
const test=(f) => {
// Omitted
// Could provide full source if needed but it's not small
}
const gen=(boxSize)=>{
const boardSize = boxSize ** 2;
return new Array(boardSize).fill(new Array(boardSize).fill(0));
}
console.log(gen(2)); // [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
test(gen(2)); // fails
test(JSON.parse(JSON.stringify(gen(2)))); // passes
test([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]); // passes
为什么我在初始化数组的方式之间会出现这种不一致的(?!)行为?
解决方案
可能这里的问题源于所有行gen(2)
都是对同一数组的引用。所以修改任何一行实际上都会修改每一行;毫无疑问,这不是你想要的行为。
这是因为该Array.fill
方法将对填充数组的每个元素使用完全相同的东西。请注意,您要填充的内容是对另一个数组的引用,因此每个元素都将是对同一数组的引用。
为了解决这个问题,我建议.map
在上面使用.fill
:
return new Array(boardSize).fill().map(() => new Array(boardSize).fill(0))
或者也许使用Array.from
:
return Array.from({length: boardSize}, () => new Array(boardSize).fill(0))
推荐阅读
- python - 如何在 Django Model 的一个模型类中使用或继承 2 个模型类字段?
- javascript - Electron 作为 Web 应用程序
- python - 从输入提示返回终止while循环 - Python
- c# - 文本c#下方的电报按钮
- docker - 在 docker compose 中从一个 docker 容器到另一个容器的 api 调用
- php - 很多人不推荐PHP中的全局变量的原因是什么?
- python - 使用 dataframe.mean() 时运行时间出现奇怪的指数增长(Pandas 性能非数字列)
- excel - 如何将选定的列连接成一列?
- javascript - Vue 组件:props 未定义
- gatling - gatling 3.2:从rest端点获取json,更改并返回