首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS:将数组的字符串与对象字段进行比较

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

Stack Overflow用户
提问于 2018-01-25 15:36:56
回答 4查看 72关注 0票数 1

有一个对象,它表示用户的角色:

代码语言:javascript
复制
const user = {
  isEditor: false,
  isAdmin: true,
  isTranslator: false
}

我需要将一些元素传递给一个函数,检查这个角色在user对象中是否有真值。

代码语言:javascript
复制
result = hasPermission(user, ['editor', 'admin']) // true
result = hasPermission(user, ['editor', 'translator']) // false

我对此有一些问题,因为角色的命名有点不同。我也考虑过使用_.some(),因为我只需要检查一个真值。

代码语言:javascript
复制
function hasPermission (user, roles) {
  roles.forEach(role => {
    user[role] // is not working as user keys named differently
  })
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-01-25 15:44:39

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

你可以像这样使用some,它非常简单:

代码语言:javascript
复制
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']));

希望这能对你有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2018-01-25 15:45:16

你正在做的事情不是正确的思考方式。

用户角色不是单个属性,而是角色的集合。因此您用户对象的建模方式应该如下所示

代码语言:javascript
复制
const MyUser = {
  roles: ["Admin","Editor"]
}

因此,您可以通过使用如下所示的函数来检查用户是否具有给定的角色:

代码语言:javascript
复制
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
}

这种思考方式的可扩展性要好得多,因为从长远来看,单独的属性不是一种可持续的方式。

编辑:说明输入角色的排列。这还没有经过测试,所以里面可能有一些语法错误,但是你明白了……

票数 3
EN

Stack Overflow用户

发布于 2018-01-25 15:56:08

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

代码语言:javascript
复制
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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48437795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档