递归过滤函数
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)回把包含关键字的子菜单找出来放到父级里边,没有符合关键字的就是空数组赋值给父级。

浙公网安备 33010602011771号