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
相关产品推荐
相关产品推荐

