首页 > 解决方案 > 使用 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"]
    }

这是一个 JS Bin 链接。

标签: javascriptarrays

解决方案


您可以使用如下.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函数。


推荐阅读