typescript 功能:while循环中的Return语句未按预期工作

yqyhoc1h  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(229)

我有一个用Typescript编写的深度优先搜索函数,该函数按照我的预期工作,遍历每个连接的节点。但是我在while循环中有一个return语句,我希望函数在当前节点的id与目标id匹配时返回。它只是一个数字等于一个数字。条件按预期满足,但函数没有返回true,它在while条件完成后返回。这是Typescript行为吗?有没有办法让它像我期望的那样工作,结束while循环并从函数返回true?

function dfs(graph: any, node: any,nodedata: any,target?: any){
    var stack: any[] = []
    var visited: any[] = []
    var visiting = null

    stack.push(node)
    visited.push(node)

    while(stack.length > 0){
        visiting = stack.pop()
        var connectedNodes = graph.getConnectedNodes(visiting.id,"to")
        connectedNodes.forEach(function(itm: any){
            var check_node = nodedata.get(itm)
                console.log("check_node",check_node.id,"target",target.id)

                // Here is the problem everything works but the return true never happens
                if(check_node.id == target.id){
                    console.log('Condition met')
                    return true
                }
                // ----------------------------------------------------------------------

            if(!visited.includes(check_node)){
                visited.push(check_node)
                stack.push(check_node)
            }
        })
    }
    
return false
}

我希望得到真,因为我设置它,所以条件是真的。我得到'条件满足',所以条件触发,但它只是下降,并返回假。正如我前面所说,函数的工作只是不返回从while。我可以解决它,但它似乎有点奇怪。

// Here is the problem everything works but the return true never happens
if(check_node.id == target.id){
   console.log('Condition met')
   return true // Never happens
}
// ----------------------------------------------------------------------

检查结果的哑代码
一个二个一个一个

5f0d552i

5f0d552i1#

您正在从forEach()函数的回调中返回true。此返回值不会返回到外部作用域。
此外,您还失去了在找到匹配值时提前返回的好处,因为forEach()会很乐意地继续迭代,而不管您从其回调中返回什么值。
最简单的解决方案是使用标准for循环:

for (let itm: any of connectedNodes) {
  // ...
  if(check_node.id == target.id) {
    return true;
  }
  // ...
}

不管出于什么原因,如果您更愿意坚持函数式范例,则可以使用some()

return connectedNodes.some((itm: any) => check_node.id === nodedata.get(itm).id);

相关问题