Reputation: 7404
I've two objects:
1. menudata:
"[{"category_id":6,"category_name":"Menu1","parent_id":1,"type":"folder","parent_name":"Menu1","page_path":"-","state":"1528796405091"},{"category_id":7,"category_name":"A","parent_id":6,"type":"folder","parent_name":"A","page_path":"-","state":"1528796433246"},{"category_id":8,"category_name":"B","parent_id":7,"type":"folder","parent_name":"B","page_path":"-","state":"1528796433298"},{"category_id":9,"category_name":"C","parent_id":8,"type":"folder","parent_name":"C","page_path":"-","state":"1528796433340"},{"category_id":10,"category_name":"D","parent_id":9,"type":"folder","parent_name":"D","page_path":"-","state":"1528796433394"},{"category_id":451,"category_name":"E","parent_id":10,"type":"file","parent_name":"E","page_path":"abc","state":"1528796433423"},{"category_id":103,"category_name":"UserPreferences","parent_id":3,"type":"file","parent_name":"UserPreferences","page_path":"../../jsp/configuration/UserPreferences.jsp","state":null},{"category_id":101,"category_name":"AddUser","parent_id":4,"type":"file","parent_name":"AddUser","page_path":"../../jsp/configuration/newuser.jsp","state":null},{"category_id":4,"category_name":"UserAccess","parent_id":2,"type":"folder","parent_name":"UserAccess","page_path":"-","state":null},{"category_id":3,"category_name":"Preferences","parent_id":2,"type":"folder","parent_name":"Preferences","page_path":"-","state":null},{"category_id":2,"category_name":"SystemAdministration","parent_id":1,"type":"folder","parent_name":"SystemAdministration","page_path":"-","state":null}]"
2. menurolesdata:
"[{"page_id":101,"category_id":4},{"page_id":103,"category_id":3},{"page_id":451,"category_id":10}]"
Here menudata object contains all the parent-child (pageid and categoryid) records while menurolesdata contains those parent and child which have some specific access. So basically I want only those records which are present in menurolesdata along with all there parents until it gets no parent.
Ex. page_id 451 in menurolesdata has parent 10, 10 has parent 9, 9 has parent 8, 8 has parent 7, 7 has parent 6, 6 has parent 1 and 1 has no parent.
So basically I want to filter menudata based on menurolesdata.
Note: page_id in menurolesdata are same as category_id in menudata
Following is my code:
getMenu() {
Promise.all([this.dashboardServerice.getMenuBar(), this.dashboardServerice.getMenuRolesDetails()).then((result) => {
let menuData = result[0];
let menuRolesData = result[1];
menuData.forEach((item,index) => {
menuRolesData.forEach((data,key) => {
if(data.page_id == item.category_id && data.category_id == item.parent_id){
console.log("item===<>", item);
this.getAllParent(menuData, data.page_id);
}
});
});
});
}
// Following is my getAllParent() recursive function:
getAllParent(arr, pageid) {
let result = [];
for(let i in arr) {
if(arr[i].category_id == pageid) {
let parent = this.getAllParent(arr, arr[i].parent_id)
if(parent.length) {
arr[i].parent_id = parent
}
result.push(arr[i])
}
}
console.log("result ====================", result);
return result
}
Here I'm getting only single result i.e.
{category_id: 101, category_name: "AddUser", parent_id: Array(1), type: "file", parent_name: "AddUser", …}
Upvotes: 0
Views: 344
Reputation: 2621
Here is something that I think works like you wanted, though it can be optimized
const menuData = [{ "category_id": 6, "category_name": "Menu1", "parent_id": 1, "type": "folder", "parent_name": "Menu1", "page_path": "-", "state": "1528796405091" }, { "category_id": 7, "category_name": "A", "parent_id": 6, "type": "folder", "parent_name": "A", "page_path": "-", "state": "1528796433246" }, { "category_id": 8, "category_name": "B", "parent_id": 7, "type": "folder", "parent_name": "B", "page_path": "-", "state": "1528796433298" }, { "category_id": 9, "category_name": "C", "parent_id": 8, "type": "folder", "parent_name": "C", "page_path": "-", "state": "1528796433340" }, { "category_id": 10, "category_name": "D", "parent_id": 9, "type": "folder", "parent_name": "D", "page_path": "-", "state": "1528796433394" }, { "category_id": 451, "category_name": "E", "parent_id": 10, "type": "file", "parent_name": "E", "page_path": "abc", "state": "1528796433423" }, { "category_id": 103, "category_name": "UserPreferences", "parent_id": 3, "type": "file", "parent_name": "UserPreferences", "page_path": "../../jsp/configuration/UserPreferences.jsp", "state": null }, { "category_id": 101, "category_name": "AddUser", "parent_id": 4, "type": "file", "parent_name": "AddUser", "page_path": "../../jsp/configuration/newuser.jsp", "state": null }, { "category_id": 4, "category_name": "UserAccess", "parent_id": 2, "type": "folder", "parent_name": "UserAccess", "page_path": "-", "state": null }, { "category_id": 3, "category_name": "Preferences", "parent_id": 2, "type": "folder", "parent_name": "Preferences", "page_path": "-", "state": null }, { "category_id": 2, "category_name": "SystemAdministration", "parent_id": 1, "type": "folder", "parent_name": "SystemAdministration", "page_path": "-", "state": null }];
const menuRolesData = [{ "page_id": 101, "category_id": 4 }, { "page_id": 103, "category_id": 3 }, { "page_id": 451, "category_id": 10 }];
function getMenuData(all, role) {
let menu = menuData.find(menu => menu.category_id === role.page_id);
while (menu) {
all.add(menu);
menu = menuData.find(parent => parent.category_id === menu.parent_id);
}
return all;
}
const result = menuRolesData.reduce((all, role) => getMenuData(all, role), new Set());
console.log(Array.from(result));
And here is editor link
Upvotes: 1