首页 > 解决方案 > 如何按角色数组过滤对象?

问题描述

我有一个包含一些对象的数组:

const array = [
            {
                id: 1,
                username: "username1",
                roles: [
                    {
                        id: 1,
                        name: "ROLE_USER"
                    },
                    {
                        id: 8,
                        name: "ROLE_ADMIN"
                    }
                ]
            },
            {
                id: 2,
                username: "username2",
                roles: [
                    {
                        id: 1,
                        name: "ROLE_USER"
                    },
                    {
                        id: 10,
                        name: "ROLE_TESTER"
                    }
                ]
            },
            {
                id: 3,
                username: "username3",
                roles: [
                    {
                        id: 1,
                        name: "ROLE_USER"
                    },
                    {
                        id: 8,
                        name: "ROLE_ADMIN"
                    }
                ]
            }
        ]

现在,如何按角色过滤这些对象?我只想让用户使用“ROLE_ADMIN”。我尝试做类似的事情:

const admins = array.filter(user => user.roles.filter(role => role.name === "ROLE_ADMIN"));

const admins = array.filter(user => user.roles.map(role => role.name === "ROLE_ADMIN"));

const admins = array.map(user => user.roles.filter(role => role.name === "ROLE_ADMIN"));

但这些都不起作用。有人能帮我吗?

标签: javascriptarraysreactjs

解决方案


尝试filter结合some

根据MDN 文档

some()方法测试数组中的至少一个元素是否通过了提供的函数实现的测试。它返回一个布尔值。

下面的片段可以帮助你

const data = [
  {
    id: 1,
    username: 'username1',
    roles: [
      {
        id: 1,
        name: 'ROLE_USER'
      },
      {
        id: 8,
        name: 'ROLE_ADMIN'
      }
    ]
  },
  {
    id: 2,
    username: 'username2',
    roles: [
      {
        id: 1,
        name: 'ROLE_USER'
      },
      {
        id: 10,
        name: 'ROLE_TESTER'
      }
    ]
  },
  {
    id: 3,
    username: 'username3',
    roles: [
      {
        id: 1,
        name: 'ROLE_USER'
      },
      {
        id: 8,
        name: 'ROLE_ADMIN'
      }
    ]
  }
]

const res = data.filter(user =>
  user.roles.some(role => role.name === 'ROLE_ADMIN')
)

console.log(res)


推荐阅读