Javascript 如何根据条件筛选数组

Javascript 如何根据条件筛选数组,javascript,arrays,typescript,angular5,Javascript,Arrays,Typescript,Angular5,我正在使用基于角色的权限,我有以下数组 let Roles = { [ { model: 'user', property: 'find', permission: 'allow' }, { model: 'user', property: 'create', permission: 'allow' }, { model: 'user', property: 'update', permission: 'deny' }, { model: 'user', pr

我正在使用基于角色的权限,我有以下数组

let Roles = {
  [
    { model: 'user', property: 'find', permission: 'allow' },
    { model: 'user', property: 'create', permission: 'allow' },
    { model: 'user', property: 'update', permission: 'deny' },
    { model: 'user', property: 'delete', permission: 'deny' }
  ],
  [
    { model: 'registration', property: 'find', permission: 'allow' },
    { model: 'registration', property: 'create', permission: 'deny' },
    { model: 'registration', property: 'update', permission: 'deny' },
    { model: 'registration', property: 'delete', permission: 'deny' }
  ]
  [
    { model: 'schedule', property: 'find', permission: 'allow' },
    { model: 'schedule', property: 'create', permission: 'allow' },
    { model: 'schedule', property: 'update', permission: 'allow' }
    { model: 'schedule', property: 'delete', permission: 'deny' }
  ]
}
我试图得到以下输出

  let userPermissions = [{
  'menu_name': 'user',
  'canFetchData': true,
  'canCreateData': true,
  'canUpdateData': false,
  'canDeleteData': false,
}]

let registrationPermissions = [{
  'menu_name': 'registration',
  'canFetchData': true,
  'canCreateData': false,
  'canUpdateData': false,
  'canDeleteData': false,
}]

let schedulePermissions = [{
  'menu_name': 'schedule',
  'canFetchData': true,
  'canCreateData': true,
  'canUpdateData': true,
  'canDeleteData': false,
}]
生成结果的条件是,对于给定的模型和属性,如果权限为allow,则应为true,否则为false

我已经尝试过编写if条件并将值赋值为true,如果条件匹配。但是对于第二个数组,这些值将被覆盖

从角色数组中,Iam将每个数组传递给以下函数并返回结果

  private canFetchData;
  private canCreateData;
  private canUpdateData;
  private canDeleteData;

filterAndApplyPermission(data) {
for (let i = 0; i < data.length; i++) {
  if (data[i].property === 'find' && data[i].permission === 'ALLOW') {
    this.canFetchData = true;
  } else if (data[i].property === 'create' && data[i].permission === 'ALLOW') {
    this.canCreateData = true;
  } else if (data[i].property === 'update' && data[i].permission === 'ALLOW') {
    this.canUpdateData = true;
  } else if (data[i].property === 'delete' && data[i].permission === 'ALLOW') {
    this.canDeleteData = true;
  }
}

const grouped_permission = {
  'menu': data[0].model,
  'canFetchData': this.canFetchData,
  'canCreateData': this.canCreateData,
  'canUpdateData': this.canUpdateData,
  'canDeleteData': this.canDeleteData,
};
   return grouped_permission;
 }
私有数据;
私人数据;
私人canUpdateData;
私人烛台;
FilterAndApplPermission(数据){
for(设i=0;i
您可以使用筛选器查找特定用户的权限数组:

roleInfo
.filter(roles=>roles[0].model==="schedule")[0]
使用reduce为每个属性创建对象和属性

rolesForUser
.reduce(
  (info,item)=>{
    switch(item.property) {
      case 'find':
        info.canFetchData = (item.permission==='allow')?true:false
        break;
      //other cases
    }
    return info;
  },
  {menu_name : user}//initial info object with menu_name set to user
);
const roleInfo=[
[
{模型:'user',属性:'find',权限:'allow'},
{模型:'user',属性:'create',权限:'allow'},
{模型:'user',属性:'update',权限:'deny'},
{模型:'user',属性:'delete',权限:'deny'}
],
[
{model:'registration',property:'find',permission:'allow'},
{model:'registration',property:'create',permission:'deny'},
{model:'registration',property:'update',permission:'deny'},
{model:'registration',property:'delete',permission:'deny'}
],
[
{模型:'schedule',属性:'find',权限:'allow'},
{模型:'schedule',属性:'create',权限:'allow'},
{模型:'schedule',属性:'update',权限:'allow'},
{模型:'schedule',属性:'delete',权限:'deny'}
]
];
常量getRoleForUser=(用户,roleInfo)=>
roleInfo
.filter(角色=>角色[0]。模型===用户)[0]
.减少(
(信息,项目)=>{
开关(item.property){
“发现”案例:
info.canFetchData=(item.permission=='allow')?true:false
打破
“创建”案例:
info.canCreateData=(item.permission=='allow')?true:false
打破
案例“更新”:
info.canUpdateData=(item.permission=='allow')?true:false
打破
案例“删除”:
info.canDeleteData=(item.permission=='allow')?true:false
打破
违约:
抛出新错误(`${item.property}是未知权限`);
}
退货信息;
},
{菜单名称:用户}
);

日志(getrolefourser(“注册”,roleInfo))如您在问题中所述

基于角色的权限,我有以下数组

您可以这样定义权限对象

const permissionObj = {
    find: 'canFetchData',
    create: 'canCreateData',
    update: 'canUpdateData',
    delete: 'canDeleteData'
}
您可以使用函数迭代数组,并在
reduce()
函数内部使用该
permissionObj

演示

const dataObj=[[{
模型:“用户”,
属性:“查找”,
权限:“允许”
}, {
模型:“用户”,
属性:“创建”,
权限:“允许”
}, {
模型:“用户”,
属性:“更新”,
权限:“拒绝”
}, {
模型:“用户”,
属性:“删除”,
权限:“拒绝”
}],
[{
型号:'注册',
属性:“查找”,
权限:“允许”
}, {
型号:'注册',
属性:“创建”,
权限:“拒绝”
}, {
型号:'注册',
属性:“更新”,
权限:“拒绝”
}, {
型号:'注册',
属性:“删除”,
权限:“拒绝”
}],
[{
型号:'时间表',
属性:“查找”,
权限:“允许”
}, {
型号:'时间表',
属性:“创建”,
权限:“允许”
}, {
型号:'时间表',
属性:“更新”,
权限:“允许”
}, {
型号:'时间表',
属性:“删除”,
权限:“拒绝”
}]
],
permissionObj={
查找:“canFetchData”,
创建:“canCreateData”,
更新:“canUpdateData”,
删除:“canDeleteData”
};
让结果=数据对象减少((r,arr)=>{
让模型=“”,
obj=arr.reduce((p,o)=>{
模型=o.model;
p[permissionObj[o.property]=o.permission.toUpperCase()=='ALLOW';
返回p;
}, {})
r[`${model}权限`]=[Object.assign(obj{
菜单名称:模型
})];
返回r;
}, {});
console.log(结果)

。作为控制台包装{max height:100%!important;top:0;}
您真的想要三个数组中只有一个对象吗?或者您只需要对象吗?可能是
this.canFetchData=true中的
this
指的是同一个对象…不过,我们还需要一些代码。请提供完整的上下文,您的代码中的
的值是多少?请花几分钟阅读。为其他人提供足够的代码来运行和重现问题将很快解决问题。同样,
角色的语法似乎是错误的