对象引用中断迭代循环

Object referencing breaking iteration loops

所以我有一个应用程序,我制作了一个 stackblitz for。它基本上是 Pacman,为 'maze'.

生成一个随机迷宫

迷宫算法设计用于两种设置之一

这意味着您可以快速生成它,或者随着时间的推移生成它并观察迷宫的发展。即时解决方案工作正常,'over time' 解决方案也可以,但在一种情况下除外。

我在 maze-algorithms.model.ts 文件中添加了三个函数:

如果我这样称呼它们,一切正常:

    let newMaze: Maze2D = { ...iterationUpdate.maze };

    newMaze = mazeObject.makeWallsThick({ ...newMaze });
    newMaze = mazeObject.mirrorMazeXDirection({ ...newMaze }, 2);
    newMaze = mazeObject.mirrorMazeYDirection({ ...newMaze }, 2);

不过,如果我先镜像,然后将墙壁加厚,它不会...

    newMaze = mazeObject.mirrorMazeXDirection({ ...newMaze }, 2);
    newMaze = mazeObject.mirrorMazeYDirection({ ...newMaze }, 2);
    newMaze = mazeObject.makeWallsThick({ ...newMaze });

您可以在 app.component.ts 中的 generateMaze() 函数中的 stackblitz 中进行测试。

在这种情况下,迷宫的大小每次都会加倍 - 主体在获取新数据时似乎正在处理来自 mirrorx 和 y 函数的处理数据,不是 新数据。该阵列很快就会失控。它似乎也没有正确镜像,所以感觉 mirrorX 和 Y 函数以某种方式反馈到生成算法中。

我对为什么会这样感到困惑,尝试过复制对象并非常小心,我没有将任何东西反馈到迭代路由中,但它似乎一直无法工作,除非我先加厚墙壁。

编辑:重申一下,这只是一个问题,如果程序随着时间的推移迭代,如果它只是制造迷宫,returns 通过主题,然后我镜像并加厚,这一切工作正常。只有当我随着时间的推移迭代,如果我在加厚墙壁之前进行镜像。

问题是,当您使用 { ...newMaze } 调用您的函数时,您只是传递了一个浅表副本。对象的属性仍然共享相同的引用(它们指向相同的事物)。查看您的代码,我看到 makeWallsThick 创建了一个新的迷宫对象,但是 mirror.. 函数对输入进行了另一个浅拷贝,然后更新了浅拷贝中的图块 - 这也更新了输入。