[英]Filtering three level nested array in javascript
I'm trying to filter an array by the third level nested array value.我正在尝试按第三级嵌套数组值过滤数组。 I tried using .filter
.我尝试使用.filter
。 The array format is shown below for example.例如,数组格式如下所示。 I need to filter menuItems based on role.我需要根据角色过滤菜单项。
const menuItems = [{
title: 'inventory',
submenu: [{
title: 'GRN',
role: ['admin']
},
{
title: 'purchase order',
role: ['user']
},
]
},
{
title: 'sales-invoice',
submenu: [{
title: 'invoice ',
role: ['admin']
},
{
title: 'invoice-list',
role: ['user']
},
]
},
]
A varible role is defined定义了变量角色
var role=['admin']
I tried to filter using the following code.我尝试使用以下代码进行过滤。 But i couldn't get the result但我无法得到结果
const result = menuItems.filter(menu => {
if (menu.submenu) {
menu.submenu.filter(submenu => {
return this.role.some(val => (submenu.role.indexOf(val) !== -1))
})
}
})
Is this what you are looking for?这是你想要的? Based on the someRole
string, it will return all submenu
items with that role.根据someRole
字符串,它将返回具有该角色的所有submenu
项。
const menuItems = [
{
title: 'inventory',
submenu: [
{
title: 'GRN',
role: ['admin']
},
{
title: 'purchase order',
role: ['user']
},
]
},
{
title: 'sales-invoice',
submenu: [
{
title: 'invoice ',
role: ['admin']
},
{
title: 'invoice-list',
role: ['user']
},
]
}
]
let someRole = 'user'
for(const menu in menuItems) {
const filteredItems = menuItems[menu].submenu.filter(item => item.role.includes(someRole))
menuItems[menu].submenu = filteredItems
}
console.log(menuItems)
If I understand correctly, you want to disable all the options for the user that are visible for the admin.如果我理解正确,您想禁用管理员可见的用户的所有选项。
var menuItems = [{ title: 'inventory', submenu: [{ title: 'GRN', role: ['admin'] }, { title: 'purchase order', role: ['user'] }, ] }, { title: 'sales-invoice', submenu: [{ title: 'invoice ', role: ['admin'] }, { title: 'invoice-list', role: ['user'] }, ] }, ] const filterMenu = (menuItems, targetRoles) => menuItems.map((item) => ({ ...item, submenu: item.submenu.filter(({role}) => targetRoles.reduce((acc, val) => acc + Number(!role.includes(val)), 0)) })) console.log(filterMenu(menuItems, ['admin']))
This might be problematic if you were to put admin and user into the roles array.如果您要将 admin 和 user 放入角色数组,这可能会出现问题。
This will work if global role
and role
in submenu object are arrays.如果全局role
和子菜单对象中的role
是数组,这将起作用。
const menuItems = [
{
title: "inventory",
submenu: [
{
title: "GRN",
role: ["admin"]
},
{
title: "purchase order",
role: ["user"]
}
]
},
{
title: "sales-invoice",
submenu: [
{
title: "invoice ",
role: ["admin"]
},
{
title: "invoice-list",
role: ["user"]
}
]
}
];
var role = ["admin"];
const result = menuItems.filter(({ submenu }) => {
if (!submenu) return false;
return submenu.some(({ role: menuItemRoles }) =>
menuItemRoles.some(menuItemRole => role.includes(menuItemRole))
);
});
console.log(result);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.