有一个对象,它表示用户的角色:
const user = {
isEditor: false,
isAdmin: true,
isTranslator: false
}我需要将一些元素传递给一个函数,检查这个角色在user对象中是否有真值。
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
})
}发布于 2018-01-25 15:44:39
这是一个最接近您的情况的解决方案,无需更改对象和函数的形状。
你可以像这样使用some,它非常简单:
const user = {
isEditor: false,
isAdmin: true,
isTranslator: false
};
function hasPermission (user, roles) {
return roles.some(role => user["is" + role[0].toUpperCase() + role.substring(1)]);
}
console.log(hasPermission(user, ['editor', 'admin']));
console.log(hasPermission(user, ['editor', 'translator']));
希望这能对你有所帮助!
发布于 2018-01-25 15:45:16
你正在做的事情不是正确的思考方式。
用户角色不是单个属性,而是角色的集合。因此您用户对象的建模方式应该如下所示
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
}这种思考方式的可扩展性要好得多,因为从长远来看,单独的属性不是一种可持续的方式。
编辑:说明输入角色的排列。这还没有经过测试,所以里面可能有一些语法错误,但是你明白了……
发布于 2018-01-25 15:56:08
您可以使用相同的属性名称Object.entries()来获取对象的属性、值对的数组,并使用Array.prototype.some()和Array.prototype.includes()来检查这些值是否匹配
const user = {
isEditor: false,
isAdmin: true,
isTranslator: false
}
const hasPermission = (o, keys) =>
Object.entries(o).some(([key, prop]) => prop && keys.includes(key));
let result = hasPermission(user, ["isEditor", "isAdmin"]);
console.log(result);
result = hasPermission(user, ["isEditor", "isTranslator"]);
console.log(result);
https://stackoverflow.com/questions/48437795
复制相似问题