0

I have mega menu that generate from JSON object like this:

[  
   {  
      "name":"Menu Item 1",
      "id":"8",
      "children":[  
         {  
            "name":"Sub Menu 1-1",
            "id":"1",
            "children":[  
               {  
                  "name":"Sub Menu 1.1.1",
                  "id":"2"
               },
               {  
                  "name":"Sub Menu 1.1.2",
                  "id":"3"
               }
            ]
         },
         {  
            "name":"Sub Menu 1.2",
            "id":"4"
         }
      ]
   },
   {  
      "name":"Menu Item 2",
      "id":"7",
      "children":[  
         {  
            "name":"Sub Menu 2.1",
            "id":"5"
         },
         {  
            "name":"Sub Menu 2.2",
            "id":"6"
         }
      ]
   }
]

How can I create a custom filter to retrieve only the matched items by their name recursively without changing the original structure?

1 Answer 1

1

Try this.

var menuItems =[{ name: 'Menu Item 1', id: '8', children:[{ name: 'Sub Menu 1-1', id: '1', children: [{ name: 'Sub Menu 1.1.1', id: '2' }, { name: 'Sub Menu 1.1.2', id: '3' }] }, { name: 'Sub Menu 1.2', id: '4' }]},{ name: 'Menu Item 2', id: '7', children: [{ name: 'Sub Menu 2.1', id: '5' }, { name: 'Sub Menu 2.2', id: '6' }] }];

var result = [];

function isObject(obj) {
  return (!!obj.name && !!obj.id);
}

function hasChildren(obj) {
  return !!obj.children && Array.isArray(obj.children);
}

function getNameList(item, matchName) {
  if(Array.isArray(item)) {
    for(var i = 0; i < item.length; i++) {
      if(hasChildren(item[i])) {
        getNameList(item[i].children, matchName);
      }
      if(isObject(item[i])) {
        if(matchName == item[i].name) result.push(item[i]);
      } 
    }
  }
}

getNameList(menuItems, 'Menu Item 1');

console.log(result);

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.