根据优先级过滤字符串数组 javascript

filter array of strings based on priorities javascript

我有一个这样的对象:

const array = {
    "clientName": "xyz",
    "exp": 0,
    "expiryInSeconds": 0,
    "prefUserName": "admin-dev",
    "roles": [
        "dsis-users",
        "fsas-dev"
    ],
   "userId": "c8fa8f52-d626-4029-824c-f168c4c818d6"
};

根据优先级,我想过滤用户的角色

  1. 如果角色有“fsas-*”,则首先过滤该角色
  2. 如果“fsas-*”不存在,则过滤“dsis-users”角色(如果不存在,则添加并过滤该角色。

预期结果: 案例 1:

i/p:{
...
"roles": [ "dsis-users", "fsas-dev"]
}
o/p: ["fsas-dev"]

案例 2:

i/p:{
...
"roles": ["dsis-users", "dsis-admin" ]
} 
or

    i/p:{
    ...
    "roles": [ "dsis-admin"]
    } 
o/p:["dsis-users"]

这是我尝试过的:

const roles = array.roles.filter(element => {
  if (element.includes('fsas-')) {
    return false;
  }else if(element.includes('dsis-users')){
    return false;
  }else{
    let a=['dsis-users'];
    return a;
  }
});

filter 遍历所有元素 - 你无法阻止它。

我认为这不是正确的方法,您应该使用 Array.findArray.findIndex 来探测 roles 数组并确定它是否有以所需的前缀。

const array = {
    "clientName": "xyz",
    "exp": 0,
    "expiryInSeconds": 0,
    "prefUserName": "admin-dev",
    "roles": [
        "dsis-users",
        "fsas-dev"
    ],
    "userId": "c8fa8f52-d626-4029-824c-f168c4c818d6"
};

const fsas = array.roles.find(role => role.includes('fsas-'))
const dsis = array.roles.find(role => role.includes('dsis-users'))

const roles = [ fsas || dsis || 'dsis-users' ]

console.log(roles)