簡體   English   中英

如何根據條件過濾數組

[英]How to filter an array based on condition

我正在開發基於角色的權限,我有以下數組,

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,
}]

對於給定的模型和屬性,生成結果的條件是,如果允許權限,則應為true,否則為false。

我試過寫if條件並將值賦值為true,如果條件匹配。 但是對於第二個數組,值是重寫的

從Roles數組中,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;
 }

您可以使用過濾器查找特定用戶的權限數組:

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 = [ [ { 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' } ] ]; const getRoleForUser = (user,roleInfo) => roleInfo .filter(roles=>roles[0].model===user)[0] .reduce( (info,item)=>{ switch (item.property) { case 'find': info.canFetchData = (item.permission==='allow')?true:false break; case 'create': info.canCreateData = (item.permission==='allow')?true:false break; case 'update': info.canUpdateData = (item.permission==='allow')?true:false break; case 'delete': info.canDeleteData = (item.permission==='allow')?true:false break; default: throw new Error(`${item.property} is an unknown permission`); } return info; }, {menu_name : user} ); console.log(getRoleForUser("registration",roleInfo)); 

正如你提到的那樣

基於角色的權限,我有以下數組

您可以像這樣定義權限對象

const permissionObj = {
    find: 'canFetchData',
    create: 'canCreateData',
    update: 'canUpdateData',
    delete: 'canDeleteData'
}

您可以使用您遍歷數組reduce()函數,並使用permissionObjreduce()函數。

DEMO

 const dataObj =[[{ 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' }] ], permissionObj = { find: 'canFetchData', create: 'canCreateData', update: 'canUpdateData', delete: 'canDeleteData' }; let result = dataObj.reduce((r, arr) => { let model = '', obj = arr.reduce((p, o) => { model = o.model; p[permissionObj[o.property]] = o.permission.toUpperCase() === 'ALLOW'; return p; }, {}) r[`${model}Permissions`] = [Object.assign(obj, { menu_name: model })]; return r; }, {}); console.log(result) 
 .as-console-wrapper { max-height: 100% !important; top: 0;} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM