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

JavaScript中图的深度优先搜索(DFS)出现TypeError: graph[start] is not iterable错误求助

问题分析与修复方案

嘿,我来帮你拆解这个问题!你的代码里藏着两个关键问题,直接导致了第二次调用的报错:

1. 为什么会抛出TypeError: graph[start] is not iterable?

第一次调用找的是终点g,当递归到g时,因为start === end直接返回true,根本不会执行到循环邻居的代码。但第二次调用找的是d,递归到g时,start不等于end,这时候代码会尝试遍历graph['g']——但你压根没给graph添加g这个键,所以graph['g']是undefined,而undefined不能被迭代,自然就抛出错误了。

2. 给字符串节点加visited属性完全无效!

你可能以为start.visited = true能标记节点已访问,但JavaScript里字符串是原始数据类型,给原始值添加属性的操作根本不会被保存。每次访问原始值的属性时,JS会临时生成一个对应的包装对象,赋值后这个对象就被销毁了,下次再访问该属性还是undefined。这意味着你的代码根本没法正确标记已访问的节点,不仅会重复处理节点,还可能引发其他逻辑问题。


修复后的代码

下面是修复好的版本,解决了上述两个问题:

const graph = {} 
graph.a = ['b', 'c'] 
graph.b = ['f'] 
graph.c = ['d', 'e'] 
graph.d = ['f'] 
graph.e = ['f'] 
graph.f = ['g'] 

function depthSearch(graph, start, end) {
  // 用单独的对象记录访问状态,避开原始值的限制
  const visited = {};

  // 内部递归函数,通过闭包共享visited对象
  function dfs(node) {
    if (node === end) return true;
    if (visited[node]) return false;
    visited[node] = true;

    // 先检查节点是否有邻居,没有的话用空数组兜底
    const neighbors = graph[node] || [];
    for (let neighbor of neighbors) {
      if (dfs(neighbor)) return true;
    }
    return false;
  }

  return dfs(start);
}

console.log(depthSearch(graph, 'a', 'g')); // 输出true
console.log(depthSearch(graph, 'a', 'd')); // 输出true

关键修复点说明

  • 用独立的visited对象记录状态:不再给字符串节点加属性,而是用对象的键值对来记录哪些节点已访问,这样状态能被正确保存,且不会污染原始数据。
  • 处理无邻居的节点:通过graph[node] || []确保即使节点没有邻居(比如g),也能遍历空数组,避免迭代undefined的错误。
  • 每次调用重置访问状态:每次调用depthSearch都会创建新的visited对象,这样多次调用之间不会互相干扰,保证每次搜索都是独立的。

内容的提问来源于stack exchange,提问作者Akzhol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:12:42