簡體   English   中英

JavaScript - 通過對象遞歸循環

[英]JavaScript - recursive looping through object

我正在嘗試為練習制作一個簡單的ACL。

我想遍歷我的對象數據,如果我的currentViewer有父,我想將他的路徑(在我的對象中訪問)添加到arrayAccess。

因此,如果我的觀眾是用戶,他的accessArray應該是["", home] ,如果他是管理員,它將是["", home, user] ,如果他是客人,它將只是[""]

如何以遞歸方式執行此操作,因此我不必創建數千個for循環?

我試圖在checkParent()調用checkParent() ,但它只會使我的循環不定式。 我很抱歉,如果這是一個愚蠢的問題,我在JS開始。

 var currentViewer = "user"; var data = { users: [{ role: "guest", access: "" }, { role: "user", access: "home", parent: "guest" }, { role: "admin", access: "user", parent: "user" } ] }; var accessArray = []; function checkRole() { var users = data.users; for (var i = 0; i < users.length; i++) { if (currentViewer === users[i].role) { accessArray.push(users[i].access); console.log(accessArray); function checkParent() { if (users[i].parent) { for (var j = 0; j < users.length; j++) { if (users[i].parent === users[j].role) { accessArray.push(users[j].access); console.log(accessArray); } } } }; checkParent(); } }; }; checkRole(); 

有很多方法可以做到這一點。 簡單的方法就是使哈希容易查找並在循環中引用父項並推送。

 var data = { users : [ { role:"guest" , access:"" }, { role:"user" , access:"home", parent: "guest" }, { role:"admin" , access:"user", parent: "user" } ] }; var roleHash = data.users.reduce(function(o, i) { o[i.role] = i; return o; }, {}); function getAccessRoles(roleKey) { var role = roleHash[roleKey]; var roles = [role.access]; while (role.parent) { role = roleHash[role.parent]; roles.unshift(role.access); } return roles; } console.log("admin", getAccessRoles("admin")); console.log("user", getAccessRoles("user")); console.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

我不認為“遞歸”本身應該是一個目標......為什么不創建一個角色及其屬性的Map,並使用parent屬性從這個地圖中檢索一個新項目,直到你不能?

 var data = { users: [{ role: "guest", access: "" }, { role: "user", access: "home", parent: "guest" }, { role: "admin", access: "user", parent: "user" } ] }; var roles = new Map(data.users.map(u => [u.role, u])); var getAccess = function(role) { var access = []; var current = roles.get(role); while (current) { access.push(current.access); current = roles.get(current.parent); } return access.reverse(); } console.log("guest", getAccess("guest")) console.log("user", getAccess("user")) console.log("admin", getAccess("admin")) 

首先構建一個對象模型,然后問題很簡單。

 var data = { users: [ { role: "guest", access: "" }, { role: "user", access: "home", parent: "guest" }, { role: "admin", access: "user", parent: "user" } ] }; var users = data.users.reduce(function (roles, user) { roles[user.role] = user; return roles; }, {}); var accessList = data.users.map(function (user) { var all = []; do { all.unshift(user.access); user = users[user.parent]; } while (user); return all; }); console.log(accessList); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM