提问者:小点点

使用单个对象内部的数组筛选对象数组


我试图测试登录的用户是否具有适当的角色来查看仪表板中的某些项目。

我有一个对象数组。 以下是用户可能看到或可能看不到的项目:

items: [
    { title: 'Guide', icon: '$guide', component: 'Guide', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
    { title: 'Courses', icon: '$courses', component: 'Course', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
    { title: 'Sections', icon: '$sections', component: 'Sections', claims: '', size: '', roles: ['superAdmin', 'admin'] },
    { title: 'Units', icon: '$units', component: 'Units', claims: '', size: '', roles: ['superAdmin', 'admin'] },
    { title: 'Groups', icon: '$groups', component: 'Groups', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
    { title: 'Users', icon: '$users', component: 'Users', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
    { title: 'FAQ', icon: '$faq', component: 'FAG', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
]

和一个管理对象。 这是用户及其权限角色:

cid: (...)
email: (...)
emailVerified: (...)
fullPath: (...)
id: undefined
roles: Array(2)
  0: "member"
  1: "pastor"

下面是我的代码:

const hasRole = this.items.filter(val => this.admin.roles.includes(val.roles))
return hasRole

这段代码不再起作用了,因为items.roles以前只是一个字符串,但是我现在把它变成了一个角色数组。

我试过多种组合,但还是很难弄清楚。


共2个答案

匿名用户

使用array.some()测试数组中的任何元素是否满足条件。 在这种情况下,条件是元素是否在另一个数组中找到。

const hasRole = this.items.filter(val => 
    this.admin.roles.some(role => val.roles.includes(role))
)
return hasRole

如果应包括this.admin对象中的所有角色,则改为Array.Every(),以产生肯定的结果。

匿名用户

我看已经有解决办法了,反正我发帖也是我的。 如果要筛选数组并只获取具有指定角色的项,则可以尝试以下操作:

null

let items= [
            { title: 'Guide', icon: '$guide', component: 'Guide', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
            { title: 'Courses', icon: '$courses', component: 'Course', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
            { title: 'Sections', icon: '$sections', component: 'Sections', claims: '', size: '', roles: ['superAdmin', 'admin'] },
            { title: 'Units', icon: '$units', component: 'Units', claims: '', size: '', roles: ['superAdmin', 'admin'] },
            { title: 'Groups', icon: '$groups', component: 'Groups', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
            { title: 'Users', icon: '$users', component: 'Users', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
            { title: 'FAQ', icon: '$faq', component: 'FAG', claims: '', size: '', roles: ['superAdmin', 'admin', 'pastor'] },
        ]


let admin = {
  roles: {
    0: "member",
    1: "pastor"
  }
}
let filtered = {}
for(role in admin.roles){
  itemsWithSpecificRole = items.filter(val => val.roles.includes(admin.roles[role]))
  Object.assign(filtered, itemsWithSpecificRole)
}

console.log(filtered)