递归过滤函数

function filterMenu (menu, keyword) {
    return data.map(item => {
        const newItem = {...item}
        if(newItem.children) {
             newItem.children = filterMenu(newItem.children, keyword)
        }
        // 如果当前节点匹配关键字,或者子节点有匹配项,则保留该节点
        const isMatch = newItem.label.includes(keyword) || 
                                (newItem.children && newItem.children.length > 0)
         return isMatch ? newItem : null
    }).filter(Boolean) // 过滤掉null值
}
let menu = [
    {
         index: '1',
         label: '菜单1',
         children: [
             {index: '1-1', label: '子菜单1'}
         ]
    },
    {
         index: '2',
         label: '菜单2',
         children: [
             {index: '2-1', label: '子菜单1'},
             {index: '2-12, label: '子菜单2'}
         ]
    },
    {
         index: '3',
         label: '菜单3'
    },
]

 

以上代码实现的功能是根据关键字对菜单进行搜索,对el-menu菜单数据进行递归处理,并且保留父级路径(即使父级菜单不匹配关键字),需要在递归过滤时保留匹配子节点的父级路径。这可以通过在递归中判断子节点是否匹配,从而决定是否保留父节点。

递归函数部分的整体逻辑是:循环menu数组,首先是第一个父菜单,判断父级菜单是否有子菜单(children),如果有的话用子菜单的数据继续调用这个递归函数,等所有的子菜单调用完递归函数后,会接着向下执行 const isMatch......这一句。

newItem.children = filterMenu(newItem.children, keyword)回把包含关键字的子菜单找出来放到父级里边,没有符合关键字的就是空数组赋值给父级。

 

posted @ 2025-12-23 11:29  seeBetter  阅读(1)  评论(0)    收藏  举报