J.K.A.
J.K.A.

Reputation: 7404

Get all parents from javascript recursive function based on condition

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

Answers (1)

Hikmat G.
Hikmat G.

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

Related Questions