javascript菜单过滤核心是比对权限标识与本地菜单的permission字段:支持字符串数组或对象格式权限,递归处理嵌套菜单,兼容通配符匹配(如user:*),并需结合路由守卫实现真正权限控制。

JavaScript 处理接口返回的用户权限列表并做菜单过滤,核心是:拿到权限标识(如字符串数组或对象),再和本地菜单配置逐项比对,保留有权限的菜单项。关键在于权限字段设计、菜单结构定义、以及过滤逻辑的健壮性。
明确权限数据格式和菜单结构
权限接口通常返回类似这样的数据:
-
字符串数组:
["user:read", "order:edit", "admin:dashboard"] -
对象形式(含操作类型):
{ "user": ["read", "write"], "order": ["edit"] }
本地菜单一般是一个嵌套数组或树形结构,每项含 id、name、path 和关键的 permission 字段(用于校验):
[
{ id: 'dashboard', name: '首页', path: '/dashboard', permission: 'admin:dashboard' },
{ id: 'user', name: '用户管理', path: '/user', permission: 'user:read' },
{ id: 'order', name: '订单管理', path: '/order', permission: 'order:edit' }
]
基础过滤:用 includes 或 some 匹配权限
如果权限是字符串数组,直接用 includes 判断菜单项是否在权限列表中:
const userPermissions = ['user:read', 'order:edit']; const menuList = [/* 上面的菜单数组 */]; <p>const filteredMenu = menuList.filter(item => item.permission && userPermissions.includes(item.permission) );</p>
若菜单含子项(如二级菜单),需递归处理:
function filterMenuByPermission(menu, permissions) {
return menu
.filter(item => !item.permission || permissions.includes(item.permission))
.map(item => ({
...item,
children: item.children
? filterMenuByPermission(item.children, permissions)
: undefined
}))
.filter(item => item.children?.length || !item.children);
}
进阶匹配:支持通配符或层级权限(如 user:*)
实际项目中常需支持模糊匹配,例如权限 "user:*" 应允许访问所有 user 相关菜单(user:read、user:edit):
- 写一个辅助函数判断是否匹配:
hasPermission('user:read', ['user:*', 'order:edit']) → true - 对每个
permission字段,检查是否存在完全匹配,或存在xxx:*形式覆盖 - 注意顺序:精确匹配优先于通配符,避免误放行
示例匹配逻辑:
function matchPermission(required, permissions) {
if (!required) return true;
return permissions.some(p => {
if (p.endsWith(':*')) {
const prefix = p.slice(0, -2);
return required.startsWith(prefix + ':');
}
return p === required;
});
}
<p>const filtered = menuList.filter(item =>
matchPermission(item.permission, userPermissions)
);</p>
结合路由守卫与动态路由注册(Vue/React 场景)
菜单过滤只是第一步,真正安全还需配合前端路由控制:
-
Vue Router:用
router.addRoute()动态添加有权限的路由,避免无权限用户手动跳转 - React Router:渲染前检查当前路径对应菜单是否有权限,无则重定向到 403 或首页
- 不建议仅靠菜单隐藏来控制权限——菜单可被绕过,后端接口仍需鉴权
菜单过滤结果可作为侧边栏或顶部导航的数据源,同时驱动路由注册和按钮级权限(如「编辑」按钮是否显示)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











