Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-通过对象的递归循环_Javascript_Arrays_Loops_Object_Recursion - Fatal编程技术网

JavaScript-通过对象的递归循环

JavaScript-通过对象的递归循环,javascript,arrays,loops,object,recursion,Javascript,Arrays,Loops,Object,Recursion,我正在尝试制作一个简单的ACL,只是为了练习 我想循环查看我的对象数据,如果我的currentViewer有父对象,我想将他的路径(对象中的访问)添加到arrayAccess 因此,如果我的查看器是用户,那么他的accessArray应该是[“”,home],如果他是管理员,那么它将是[“”,home,user],如果他是来宾,那么它将只是[“”] 如何以递归的方式进行,这样我就不必创建数千个for循环了 我试图在我的checkParent()中调用一个checkParent(),但它只会使我的

我正在尝试制作一个简单的ACL,只是为了练习

我想循环查看我的对象数据,如果我的currentViewer有父对象,我想将他的路径(对象中的访问)添加到arrayAccess

因此,如果我的查看器是用户,那么他的accessArray应该是
[“”,home]
,如果他是管理员,那么它将是
[“”,home,user]
,如果他是来宾,那么它将只是
[“”]

如何以递归的方式进行,这样我就不必创建数千个for循环了

我试图在我的
checkParent()
中调用一个
checkParent()
,但它只会使我的循环不定式。如果这是一个愚蠢的问题,我很抱歉,我刚刚开始学习JS

var currentViewer=“用户”;
风险值数据={
用户:[{
角色:“来宾”,
访问:“”
},
{
角色:“用户”,
访问:“主页”,
家长:“客人”
},
{
角色:“管理员”,
访问权限:“用户”,
父项:“用户”
}
]
};
var accessArray=[];
函数checkRole(){
var users=data.users;
对于(var i=0;icheckRole()有很多方法可以做到这一点。简单的方法就是创建一个散列,以便在循环和推送中轻松查找和引用父对象

var data={用户:[
{角色:“来宾”,访问:},
{角色:“用户”,访问:“主页”,家长:“来宾”},
{角色:“管理员”,访问:“用户”,父级:“用户”}
]
};
var roleHash=data.users.reduce(函数(o,i){
o[i.role]=i;
返回o;
}, {});
函数getAccessRoles(roleKey){
变量角色=roleHash[roleKey];
var roles=[role.access];
while(role.parent){
role=roleHash[role.parent];
roles.unshift(role.access);
}
返回角色;
}
log(“admin”,getAccessRoles(“admin”);
log(“用户”,getAccessRoles(“用户”);
log(“guest”,getAccessRoles(“guest”)您可以尝试以下方法:

var data = { 
    users : [
        { role:"guest" , access:"" },
        { role:"user" , access:"home", parent: "guest" },
        { role:"admin" , access:"user", parent: "user" }
    ]
};

var currentUser = "admin";

var arr = [];//array that you need

var defineAccess = function(item){
    if(item.parent){
        var index = data.users.map(function(e) { return e.role; }).indexOf(item.parent);
        defineAccess(data.users[index]); //recursive calling
        arr.push(data.users[index].access);
    }
}

data.users.forEach(function(item){
    if(currentUser === item.role){
        arr.push(item.access);
        defineAccess(item);
    }   
})

console.log(arr); //final output array
我不认为“递归性”本身就是一个目标。。。为什么不创建角色及其属性的映射,并使用
parent
属性从此映射中检索新项目,直到无法检索为止

var数据={
用户:[{
角色:“来宾”,
访问:“”
},
{
角色:“用户”,
访问:“主页”,
家长:“客人”
},
{
角色:“管理员”,
访问权限:“用户”,
父项:“用户”
}
]
};
var roles=newmap(data.users.Map(u=>[u.role,u]);
var getAccess=函数(角色){
var访问=[];
var current=roles.get(角色);
while(当前){
access.push(当前访问);
current=roles.get(current.parent);
}
返回access.reverse();
}
console.log(“guest”,getAccess(“guest”))
console.log(“用户”,getAccess(“用户”))

log(“admin”,getAccess(“admin”))
首先构建一个对象模型,然后问题就简单了

var数据={
用户:[
{
角色:“来宾”,
访问:“”
},
{
角色:“用户”,
访问:“主页”,
家长:“客人”
},
{
角色:“管理员”,
访问权限:“用户”,
父项:“用户”
}
]
};
var users=data.users.reduce(函数(角色,用户){
角色[user.role]=用户;
返回角色;
}, {});
var accessList=data.users.map(函数(用户){
var all=[];
做{
all.unshift(用户访问);
user=users[user.parent];
}while(用户);
全部归还;
});

console.log(accessList)谢谢,但是你的管理员数组只返回
[“home”,“user”]
而不是
[,“home”,“user”]
@Sara:my bad,请检查我更新的答案。它现在可以正常工作了