JavaScript递归函数内部返回前有值,调用后返回undefined是什么原因
问题原因
你的递归函数在nextData.length > 0的分支中,没有将递归调用的结果向上返回,导致最外层的函数调用最终没有拿到有效值。
第一个测试场景所有数据的层级都是0,第一次执行函数就触发nextData.length == 0的分支,直接return了resultData,因此返回结果正常。
第二个测试场景存在多级层级,第一次调用函数时会进入else分支执行递归,但这个分支没有写return语句,JS中函数没有显式return时默认返回undefined,因此最外层调用拿到的结果就是undefined,底层递归return的正确结果没有被一层层传递回来。
修复方案
只需要给else分支里的递归调用加上return即可,修改后的代码如下:
function recursiveDataCreator(data, _level, _resultData){ let level = typeof _level == "undefined" ? 0 : _level; let resultData = typeof _resultData == "undefined" ? [] : _resultData; let setResultFunc = function(entry, upperKey, target){ if(upperKey == null || typeof upperKey == "undefined"){ target.push(entry); }else{ target.forEach((it)=>{ if(it.key == upperKey){ if(typeof it.children == "undefined"){ it.children = []; } it.children.push(entry); } }); } } let lvData = data.filter((it)=>it.level==level); let nextData = data.filter((it)=>it.level!=level); lvData.forEach((it)=>{ let entry = { key: it.key , upperKey: it.upperKey , title: it.title , data: it.data }; setResultFunc(entry, it.upperKey, resultData); }); if(nextData.length == 0){ console.log("before return"); console.log(resultData); return resultData; }else{ // 新增return,把递归结果层层向上传递 return recursiveDataCreator(nextData, (level+1), resultData); } }
修改后再测试第二个场景,外部就能正常拿到返回的层级数组了。
内容的提问来源于stack exchange,提问作者Seung gu KANG
相关产品推荐
相关产品推荐

