递归转换与尾递归

问题

获取如下结构的path,并过滤包含子节点的path

[
    {
        path: '/test',
        component: 'x',
    },
    {
        path: '/',
        component: 'x',
        routes: [
            {
                path: '/aaa',
                component: 'x',
            },
            {
                path: '/bbbb',
                component: 'x',
            },
        ]
    }
]

实现

递归

const routers =  [];
const childrenKey = 'routes';
const pathKey = 'path';
function getCom (targetArr){
    const arr = [];
    targetArr.forEach(item=>{
        if(Array.isArray(item[childrenKey])) {
            arr.push(...getCom(item[childrenKey]));
        }else {
            arr.push(item[pathKey])
        }
    })
    return arr
}
const coms = getCom(routers)

尾递归(转换要点:在最后一句时所有依赖的遍历转为递归函数参数)

const routers =  [];
const childrenKey = 'routes';
const pathKey = 'path';
function getCom (result, others = [] ){
    if(others.length===0){
        return result;
    }
    result.push(...others.filter(i=>!i[childrenKey]).map(i=>i[pathKey]));
    var nextOthers = [];
    others.filter(i=>i[childrenKey]).forEach(i=>nextOthers.push(...i[childrenKey]));
    return getCom(result, nextOthers);
}
const coms = getCom([], routers)

迭代

const routers =  [];
const childrenKey = 'routes';
const pathKey = 'path';
function getCom (others){
    const result = [];
    const stack = [...others.reverse()];
    while(stack.length>0){
        const item = stack.pop();
        if(!item[childrenKey]){
            result.push(item[pathKey]);
            continue;
        }
        stack.push(...item[childrenKey])
    }
    return result;
}
const coms = getCom(routers)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容