简体   繁体   English

在javascript中过滤三级嵌套数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM