首页 > 解决方案 > 如何在递归 javascript 调用中正确设置 return 语句?

问题描述

我正在尝试通读目录结构和子目录以查找名称与一组条件匹配的文件。我正在使用递归函数遍历目录中的每个项目。如果它是一个文件并且符合条件,则返回文件路径,否则,继续下一项。

我可以在找到匹配项时记录它,但在尝试从函数返回时得到 UNDEFINED。

像这里这里这样的许多 SO 帖子表明我需要在递归调用中添加一个 return 语句,但我似乎无法做到正确。

我怎样才能从这个函数返回?

function checkForProjectTrackFile(projfolder, projname) {

  fs.readdirSync(projfolder).forEach(projfile => {

    if (fs.statSync(path.join(projfolder, projfile)).isDirectory()) {

      //if a directory, call function again
      return checkForProjectTrackFile(path.join(projfolder, projfile), projname)
      
    } else {
        
        if (isProjectTrackMatch(projfile, projname)) {
          
          console.log("Match Found", path.join(projfolder, projfile))
          
          //match criteria met, return the file path  => UNDEFINED

          return (path.join(projfolder, projfile))
        }
    }
 })
}

标签: javascriptrecursionreturn-value

解决方案


每次通过时,checkForProjectTrackFile()您都需要返回一个表明您找到结果的值(在本例中为字符串)或一个表明未找到结果的值(我选择了null):

function checkForProjectTrackFile(projfolder, projname) {
  let r = null; // assume

  fs.readdirSync(projfolder).forEach(projfile => {

    if (fs.statSync(path.join(projfolder, projfile)).isDirectory()) {

      //if a directory, call function again
      r = checkForProjectTrackFile(path.join(projfolder, projfile), projname)
      if ( r !== null ) {
         break; // Found a match, so unwind and get out
         // Note: return r would also work here
      } // no need for 'else' since we want to keep looping to check the rest of the projfile values at this level!
      
    } else {
      if (isProjectTrackMatch(projfile, projname)) {
          
        console.log("Match Found", path.join(projfolder, projfile))
          
        //match criteria met, return the file path  => UNDEFINED

        r = (path.join(projfolder, projfile));

        break; // We found a match, so stop processing directory entries
      }
    }
  })

  return r; // Return what we found (whether null or otherwise)
}

推荐阅读