简体   繁体   中英

Deep filter objects in javascript array

From the following code below I need to return only the objects that have meta.menu in them while preserving the structure.

So in the case below, only the object with "panel.users.view" would get removed. I've tried making a recursive function to traverse it but I can't figure out how to infinitely traverse it because there could be more objects. I don't know how many levels deep a routes object can get.

I've also looked through lodash and collect.js to see if there were functions that could be used for this but I'm unable to find a solution on my own.

Would greatly appreciate the help, many thanks!

const routes = [
    {
        path: "/panel",
        name: "panel",
        redirect: { name: "panel.dashboard" },
        component: {},
        children: [
            {
                path: "/dashboard",
                name: "panel.dashboard",
                component: {},
                meta: {
                    menu: "main"
                },
            },
            {
                path: "/users",
                name: "panel.users",
                redirect: { name: "panel.dashboard" },
                component: {},
                children: [
                    {
                        path: "list",
                        name: "panel.users.list",
                        component: {},
                        meta: {
                            menu: "main"
                        },
                    },
                    {
                        path: "view/:user_id",
                        name: "panel.users.view",
                        component: {},
                    },
                ],
            }
        ],
    }
];

You could imagine a recursive function which would look something like.

const res = [];
function findMeta(rs) {
  rs.forEach(r => {
      for (let [key, value] of Object.entries(r)) {
        //console.log(`${key}`, value);
                if(key === "children") findMeta(value);
                if(key === "meta") res.push(r);
      }
  })
  return res;
}

 const routes = [ { path: "/panel", name: "panel", redirect: { name: "panel.dashboard" }, component: {}, children: [ { path: "/dashboard", name: "panel.dashboard", component: {}, meta: { menu: "main" }, }, { path: "/users", name: "panel.users", redirect: { name: "panel.dashboard" }, component: {}, children: [ { path: "list", name: "panel.users.list", component: {}, meta: { menu: "main" }, }, { path: "view/:user_id", name: "panel.users.view", component: {}, }, ], } ], } ]; const res = []; function findMeta(rs) { rs.forEach(r => { for (let [key, value] of Object.entries(r)) { //console.log(`${key}`, value); if(key === "children") findMeta(value); if(key === "meta") res.push(r); } }) return res; } console.log(findMeta(routes))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM