You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:40:24