Javascript JS:将数组的字符串与对象字段进行比较

Javascript JS:将数组的字符串与对象字段进行比较,javascript,ecmascript-6,Javascript,Ecmascript 6,存在一个表示用户角色的对象: const user = { isEditor: false, isAdmin: true, isTranslator: false } 我需要将一些元素传递给函数,以检查此角色中是否有任何角色在用户对象中具有真实值 result = hasPermission(user, ['editor', 'admin']) // true result = hasPermission(user, ['editor', 'translator']) // fal

存在一个表示用户角色的对象:

const user = {
  isEditor: false,
  isAdmin: true,
  isTranslator: false
}
我需要将一些元素传递给函数,以检查此角色中是否有任何角色在用户对象中具有真实值

result = hasPermission(user, ['editor', 'admin']) // true
result = hasPermission(user, ['editor', 'translator']) // false
我有一些问题,因为角色的命名有点不同。 我还考虑过使用
。.some()
,因为我只需要检查一个真值

function hasPermission (user, roles) {
  roles.forEach(role => {
    user[role] // is not working as user keys named differently
  })
}

这是一个最接近您的情况的解决方案,无需更改对象和功能的形状

实际上,您可以像这样使用
一些
,非常简单:

const用户={
编辑:错,
伊萨明:是的,
isTranslator:错误
};
功能权限(用户、角色){
返回roles.some(role=>user[“is”+role[0].toUpperCase()+role.substring(1)];
}
log(拥有权限(用户,['editor','admin']);

log(拥有权限(用户,['editor','translator'])这是一个最接近您的情况的解决方案,无需更改对象和函数的形状

实际上,您可以像这样使用
一些
,非常简单:

const用户={
编辑:错,
伊萨明:是的,
isTranslator:错误
};
功能权限(用户、角色){
返回roles.some(role=>user[“is”+role[0].toUpperCase()+role.substring(1)];
}
log(拥有权限(用户,['editor','admin']);

log(拥有权限(用户,['editor','translator'])你所做的不是正确的思考方式

用户角色不是单个属性,而是角色的集合。 因此,您的用户对象应该类似于模型

const MyUser = {
  roles: ["Admin","Editor"]
}
因此,您可以使用如下函数检查用户是否具有给定角色:

function UserHasAnyRole(user,roleKeys)
{
    if(user && user.roles && roleKeys && roleKeys.length)
    {
        return user.roles.filter(function(r){
            return roleKeys.filter(function(k){ return k == r;}).length>0; 
        }).length > 0;

    }       
    return false;    
}

var neededRoles = ["Admin","Translator"];

if(UserHasAnyRole(MyUser,neededRoles))
{
// do stuff
}
这种思考方式的规模要大得多,因为从长远来看,单个房产并不是一种可持续的方式


编辑:说明输入角色的数量。这不是经过测试的,所以可能有一些语法错误,但是你知道了…

你所做的不是正确的思考方式

用户角色不是单个属性,而是角色的集合。 因此,您的用户对象应该类似于模型

const MyUser = {
  roles: ["Admin","Editor"]
}
因此,您可以使用如下函数检查用户是否具有给定角色:

function UserHasAnyRole(user,roleKeys)
{
    if(user && user.roles && roleKeys && roleKeys.length)
    {
        return user.roles.filter(function(r){
            return roleKeys.filter(function(k){ return k == r;}).length>0; 
        }).length > 0;

    }       
    return false;    
}

var neededRoles = ["Admin","Translator"];

if(UserHasAnyRole(MyUser,neededRoles))
{
// do stuff
}
这种思考方式的规模要大得多,因为从长远来看,单个房产并不是一种可持续的方式


编辑:说明输入角色的数量。这没有经过测试,因此可能有一些语法错误,但您得到了这样的想法…

您可以使用相同的属性名称,
Object.entries()
来获取属性数组、对象的值对和
array.prototype.some()
array.prototype.includes()
来检查值是否匹配

const用户={
编辑:错,
伊萨明:是的,
isTranslator:错误
}
const hasPermission=(o,键)=>
Object.entries(o).some([key,prop])=>prop&&key.includes(key));
let result=hasPermission(用户,[“iEdit”,“iAdmin”);
控制台日志(结果);
结果=hasPermission(用户,[“iEdit”、“iTranslator”]);

控制台日志(结果)
您可以使用相同的属性名称,
Object.entries()
来获取属性数组、对象的值对和
array.prototype.some()
array.prototype.includes()
来检查值是否匹配

const用户={
编辑:错,
伊萨明:是的,
isTranslator:错误
}
const hasPermission=(o,键)=>
Object.entries(o).some([key,prop])=>prop&&key.includes(key));
let result=hasPermission(用户,[“iEdit”,“iAdmin”);
控制台日志(结果);
结果=hasPermission(用户,[“iEdit”、“iTranslator”]);

控制台日志(结果)这里是另一个解决方案

const用户={
编辑:错,
伊萨明:是的,
isTranslator:错误
};
功能权限(用户、角色){
const userRoles=Object
.条目(用户)
.filter(([\u,val])=>val)
.map(([key,)]=>key.replace('is','').toLowerCase());
returnroles.some(x=>userRoles.includes(x));
}
log(拥有权限(用户,['editor','admin']);

log(拥有权限(用户,['editor','translator'])这里是另一个解决方案

const用户={
编辑:错,
伊萨明:是的,
isTranslator:错误
};
功能权限(用户、角色){
const userRoles=Object
.条目(用户)
.filter(([\u,val])=>val)
.map(([key,)]=>key.replace('is','').toLowerCase());
returnroles.some(x=>userRoles.includes(x));
}
log(拥有权限(用户,['editor','admin']);

log(拥有权限(用户,['editor','translator'])是否强制为密钥指定不同的名称?这会更简单,也不会那么难看。@sjahan如果真的更简单,我可以更改角色数组字符串名称。。。不是对象键。
返回用户[“is”+“admin.slice(0,1).toUpperCase()+“admin.slice(1)]
@user3142695如果语法始终保持不变,这不是什么大问题,请检查我的解决方案;)您是否被迫为您的钥匙指定不同的名称?这会更简单,也不会那么难看。@sjahan如果真的更简单,我可以更改角色数组字符串名称。。。不是对象键。
返回用户[“is”+“admin.slice(0,1).toUpperCase()+“admin.slice(1)]
@user3142695如果语法始终保持不变,这不是什么大问题,请检查我的解决方案;)这是一个非常好的观点。谢谢你。但是如果我像你建议的那样更改结构,我仍然有multpile roleKeys的输入,我想检查是否有与用户匹配的输入。请查看答案,我忘记考虑多个inputs@MKougiouris-以下是一些代码改进:1)将字符串文本作为常量导出到