javascript - 使用 JavaScript 将变量与嵌套数组中的对象匹配
问题描述
我试图在这个 JSON 数组中找到一个匹配项,但我发现它有点复杂,因为它是一个嵌套的对象数组。
我不确定我在这里做错了什么:
这个想法是我有一个具有一组权限的数组,我只想返回与角色匹配的权限集:
var data = [{
"visitor": {
"static": ["page-one:visit", "home-page:visit", "login"]
}
}, {
"users": {
"static": ["posts:list", "posts:create", "users:getSelf", "home-page:visit", "dashboard-page:visit"]
}
}, {
"admin": {
"static": ["posts:list", "posts:create", "posts:edit", "posts:delete", "users:get", "users:getSelf", "home-page:visit", "dashboard-page:visit"]
}
}]
var role = "admin"
for(var x=0;x <data.length;x++){
if(role === data[x]){
console.log("OLE, we got a match!" + data[x])
}
}
由于某种原因,我只是找不到匹配项。我只想返回完整的对象,例如:
"admin":{
"static": ["posts:list", "posts:create", "posts:edit", "posts:delete", "users:get", "users:getSelf", "home-page:visit", "dashboard-page:visit"]
}
解决方案
您可以使用如下.find
功能:
data.find(function(x){ return Object.keys(x).indexOf(role) > -1; });
鉴于您的角色是对象的键,您需要检查对象本身是否包含角色作为键,为此您将使用Object.keys(<object>).indexOf(role)
whereindexOf
将返回值-1
是否未找到和0+
是否找到。
var data = [{"visitor":{"static":["page-one:visit","home-page:visit","login"]}},{"users":{"static":["posts:list","posts:create","users:getSelf","home-page:visit","dashboard-page:visit"]}},{"admin":{"static":["posts:list","posts:create","posts:edit","posts:delete","users:get","users:getSelf","home-page:visit","dashboard-page:visit"]}}]
var role = "admin"
var admins = data.find(function(x){ return Object.keys(x).indexOf(role) > -1; });
console.log(admins);
如果您想适应一系列不同的角色,可以使用以下易于理解的示例。
var data = [{"visitor":{"static":["page-one:visit","home-page:visit","login"]}},{"users":{"static":["posts:list","posts:create","users:getSelf","home-page:visit","dashboard-page:visit"]}},{"admin":{"static":["posts:list","posts:create","posts:edit","posts:delete","users:get","users:getSelf","home-page:visit","dashboard-page:visit"]}}]
var role = ["admin", "visitor"];
var admins = role.map(function(role) { return getObjectsForRole(role); })
function getObjectsForRole(role)
{
return data.find(function(x){
return Object.keys(x).indexOf(role) > -1;
});
}
console.log(admins);
上面的内容与之前几乎相同,但我们映射 ( .map
) 每个角色并调用包含我们对函数的调用的.find
函数。
推荐阅读
- c# - RegEx 需要将数字匹配到小数点后 2 位,可选 $ 和逗号
- meteor - 使用 simpl-schema 时字段 XXX 中的未知键
- angular - 是否可以删除或禁用或隐藏angular4中选择属性的下拉选项
- java - Java Media Framework 安装失败
- php - 使用通过rest apis快速结帐的Paypal一次性购买和定期付款
- c# - 发现数据源的模式
- testing - 本地主机服务器的Jmeter测试?
- python - R - 来自包含分类变量的数据框的框和散点图
- reactjs - CRUD操作后如何在react js中重新渲染/更新表?
- android - Android如何将线性布局的高度设置为listview元素?