SOURCE

let routerList = [
    {
        name: '1',
        path: '/1',
        children: [
            {
                name: '1-1',
                path: '/1-1',
                isHidden: true,
                rule: ['b', 'd'],
                children: [
                    {
                        name: '1-1-1',
                        path: '/1-1-1',
                    }
                ]
            }
        ]
    },
    {
        name: '2',
        path: '/2',
        children: [
            {
                name: '1-1',
                path: '/2-1',
                rule: ['b', 'd'],
                children: [
                    {
                        name: '1-1-1',
                        path: '/1-1-1',
                        isHidden: true,
                    }
                ]
            }
        ]
    },
    {
        path: '/404'
    }
]

let userRole = [{ auth: 'a' }, { auth: 'b' }, { auth: 'c' }]


// 如果没有属性值或者为空就返回false了
let judge = function (obj, attr) {
    if (!Object.hasOwn(obj, attr)) {
        return false
    } else if (!obj[attr] && obj[attr] != 0) {
        return false
    } else {
        return true
    }
}

// 判断有么有权限
let judgeRule = function (ruleList, selfRule) {
    let result = false
    for (let x = 0; x < ruleList.length; x++) {
        for (let y = 0; y < selfRule.length; y++) {
            if (ruleList[x].auth === selfRule[y]) {
                result = true
                break
            }
        }
    }
    return result
}

    let fn = function (data) {
        let result = []
        data.forEach((item) => {
            if (judge(item, 'name') && (!judge(item, 'isHidden') || !item.isHidden) && (!judge(item, 'rule') || judgeRule(userRole, item.rule))) {
                // 可以渲染 有name 没隐藏  有权限交集或者是没有权限要求
                if (judge(item, 'children') && item.children.length > 0) {
                    let x = fn(item.children)
                    if(x.length > 0){
                        result.push({ label: item.name, key: item.path, children: x })
                    } else {
                        result.push({ label: item.name, key: item.path })
                    }
                } else {
                    result.push({ label: item.name, key: item.path })
                }
            }
        })
        return result
    }

console.log(fn(routerList))
console 命令行工具 X clear

                    
>
console