JavaScript实现Prim算法生成迷宫时frontier列表初始存储异常
检查
neighbors()方法的返回值类型:
确认该方法返回的是全新数组还是复用了同一引用对象。JS中对象是引用传递,如果neighbors()每次返回的都是同一个数组实例,往frontier中添加时实际存的是同一引用,后续修改这个数组会覆盖之前的存储内容。可以在neighbors()里用return [...生成的邻居数组]的方式返回新数组,避免引用冲突。核对
listValues的元素添加逻辑:
排查往listValues中添加元素的代码是否有误。比如如果写了listValues = random_point.neighbors(),这是直接替换了整个数组的引用,而非追加元素;正确的写法应该是listValues.push(...random_point.neighbors()),批量把邻居元素加入列表。排查变量作用域问题:
确认listValues是否处于generate方法的正确作用域内。如果在generate方法内部重新声明了同名变量(比如let listValues = []),会覆盖外部的frontier引用,导致之前的存储失效。用打印调试定位问题:
作为JS新手,最直接的调试方式是在关键节点打印listValues的状态:// 添加邻居前打印 console.log('添加前frontier长度:', listValues.length); const newNeighbors = random_point.neighbors(); console.log('获取到的邻居:', newNeighbors); listValues.push(...newNeighbors); // 添加邻居后打印 console.log('添加后frontier长度:', listValues.length);通过输出可以直观判断是元素没加进去,还是加进去后被其他代码修改了。
对比frontier_neighbors的处理逻辑:
既然处理frontier_neighbors时能正常存储,把这部分代码和random_point.neighbors()的添加逻辑做对比,看是否存在返回值类型、添加方式的差异。比如前者返回的是坐标对象的副本,而后者是引用类型;或者前者用了正确的追加方式,后者误用了赋值操作。
内容的提问来源于stack exchange,提问作者Gaurav malik

