JS中二维数组副本读取属性出现undefined错误求助
问题分析:二维数组副本访问出现undefined的原因及修复
核心问题
你遇到的undefined错误不是数组复制方式导致的,而是递归调用DFS函数时遗漏了传递visited参数。
具体原因
看你代码中的DFS调用部分:
DFS(grid, x + 1, y); DFS(grid, x - 1, y); DFS(grid, x, y + 1); DFS(grid, x, y - 1);
这几行调用都只传了3个参数,但DFS函数定义需要4个参数(grid, x, y, visited)。当递归执行时,函数内部的visited参数会变为undefined,此时访问visited[x][y]就会抛出“无法读取未定义属性”的错误。
而你最初的visited数组复制方式是正确的:
const visited = grid.map((row) => { return row.map((square) => false) })
通过两层map创建的二维数组,和原grid的结构完全一致,每个元素初始化为false,这部分没有问题。
修复后的完整代码
/** * @param {character[][]} grid * @return {number} */ var numIslands = function(grid) { let MAX_X = grid.length; let MAX_Y = grid[0].length; let num_of_islands = 0; const visited = grid.map((row) => { return row.map(() => false) }) for(let x = 0; x < MAX_X; x++) { for(let y = 0; y < MAX_Y; y++) { if(grid[x][y] === '1' && !visited[x][y]) { num_of_islands+= 1; DFS(grid, x, y, visited) } } } return num_of_islands }; function DFS(grid, x, y, visited) { if(x < 0 || x >= grid.length || y < 0 || y >= grid[0].length) { return; } if(grid[x][y] === '0' || visited[x][y]) { return; } grid[x][y] = '0'; visited[x][y] = true; // 补上缺失的visited参数 DFS(grid, x + 1, y, visited); DFS(grid, x - 1, y, visited); DFS(grid, x, y + 1, visited); DFS(grid, x, y - 1, visited); } let grid = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]]; console.log(numIslands(grid)); // 输出1,符合预期
额外说明
修复后,递归过程中visited参数能正常传递,标记已访问的位置,不会再出现undefined错误。同时你的岛屿计数逻辑是正确的,最终会输出正确的岛屿数量。
内容的提问来源于stack exchange,提问作者youngprogrammer1997
相关产品推荐
相关产品推荐

