我有一个菜单结构如下:
const menu = [
{
title: 'Supervisor Dashboard',
link: '/dashboard/supervisor-dashboard',
slug: '/dashboard/supervisor-dashboard'
},
{
title: 'User Dashboard',
link: '/dashboard/user-dashboard',
slug: '/dashboard/user-dashboard'
},
{
title: 'Inventory',
slug: '/inventory',
children: [
{
title: 'Add Inventory',
link: '/inventory/add-inventory',
slug: '/inventory/add-inventory'
},
{
title: 'Remove Inventory',
link: '/inventory/remove-inventory',
slug: '/inventory/remove-inventory'
},
]
},
{
title: 'Membership',
slug: '/membership',
children: [
{
title: 'Program A',
slug: '/membership/program-a',
children: [
{
title: 'View Membership',
link: '/membership/program-a/view',
slug: '/membership/program-a/view'
},
{
title: 'Add Membership',
link: '/membership/program-a/add',
slug: '/membership/program-a/add'
},
{
title: 'Delete Membership',
link: '/membership/program-a/delete',
slug: '/membership/program-a/delete'
}
]
},
{
title: 'Program B',
slug: '/membership/program-b',
children: [
{
title: 'View Membership',
link: '/membership/program-b/view',
slug: '/membership/program-b/view'
},
{
title: 'Add Membership',
link: '/membership/program-b/add',
slug: '/membership/program-b/add'
},
{
title: 'Delete Membership',
link: '/membership/program-b/delete',
slug: '/membership/program-b/delete'
}
]
}
],
},
];
我希望过滤菜单,即仅显示用户被授权的内容。用户只能根据允许的slug(如下所示)查看菜单:
const allowed_slug = [
'/dashboard/user-dashboard',
'/inventory/add-inventory',
'/membership/program-b/view',
'/membership/program-b/add'
];
使用 .filter
我能够过滤数组的第一层。目前我已经实现了以下内容:
function filterMenu(menus, allowed_slug) {
const result = menus.filter(function (menu_item) {
return allowed_slug.filter(function(slug) {
return menu_item.slug.indexOf(slug) > -1;
}).length;
});
return result;
}
理想的输出应该像这样:
o
|-- User Dashboard
|-- Inventory
| `-- Add Inventory
`-- Membership
`-- Program B
|-- View Membership
`-- Add Membership
问题是,我无法过滤嵌套数组,即子级和孙级。非常感谢任何帮助 :)
some()
或every()
代替filter().length
。另外,我相信你要找的是menu_item.slug.indexOf(slug) == 0
(而不是>= 0
),或者是menu_item.slug.startsWith(slug)
。 - Bergimap
来实现。我的评论只是一个额外的建议。 - Bergi