You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:18:04