【发布时间】:2019-08-10 10:04:58
【问题描述】:
我的菜单结构如下:
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) -
为什么仪表板没有缩进?
-
@NinaScholz 这就是结构。我想添加一些动态结构。
-
@Bergi 仍然无法解决嵌套过滤问题。我已经尝试了一天多结合多个数组原型函数。
-
@NinaScholz 实际上,它与您在 stackoverflow.com/a/45482594 中的答案非常相似。只是结构更加嵌套。
标签: javascript arrays filtering