【问题标题】:How to properly set the return statement in a recursive javascript call?如何在递归 javascript 调用中正确设置 return 语句?
【发布时间】:2020-08-12 05:47:25
【问题描述】:

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

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

herehere 等许多 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))
        }
    }
 })
}

【问题讨论】:

    标签: javascript recursion return-value


    【解决方案1】:

    每次通过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)
    }
    

    【讨论】:

    • 谢谢,@kmoser。建议的代码在所有条件下都返回“null”,但将“r = checkForProjectTrackFile()....”直接移动到“if (r ! == null)”块下方会根据需要返回 null 或匹配项。也欣赏cmets,有助于理解。另外,using break caused some syntax errors,但使用 return 就可以了。
    • @bcarp121177 对,我忘了你用的是forEach(),它不支持break。很高兴你成功了!
    猜你喜欢
    • 2020-01-04
    • 2018-09-10
    • 1970-01-01
    • 2016-05-21
    • 2018-06-28
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多