javascript - 递归过滤 bool 键的数据

标签 javascript vue.js recursion filter

我的导航从 vue-router 获取路线,这样我就不必手动添加它们。

这些路由及其子路由都有一个名为“inMenu”的元 bool 键。我只过滤了父路由,但没有过滤子路由。

var res = this.$router.options.routes.filter(function f(o) {
  if (o.route.meta.inMenu === true) return true

  if (o.children) {
    return (o.children = o.children.filter(f)).length
  }
})

这就是我过滤父路由的方式,但我无法管理它来过滤子路由。

return this.$router.options.routes.filter(route => route.meta.inMenu === true);

这是一些示例数据:

{
  "path": "/orders",
  "component": {
    "name": "Orders",
    "__file": "src/views/Orders.vue",
  },
  "meta": {
    "icon": "fa-history",
    "title": "Abwicklungen",
    "inMenu": true
  },
  "children": [
    {
      "path": "list",
      "name": "orderList",
      "component": {
        "name": "OrderList",
        "__file": "src/views/orders/list.vue",
      },
      "meta": {
        "title": "Bestellliste",
        "icon": "fa-circle-o",
        "inMenu": true
      }
    },
    {
      "path": "details/:id",
      "name": "orderDetails",
      "component": {
        "name": "OrderDetails",
        "__file": "src/views/orders/details.vue"
      },
      "meta": {
        "title": "Bestellung",
        "icon": "fa-circle-o",
        "inMenu": false
      }
    },
    {
      "path": "dailyclosing",
      "component": {
        "name": "OrderList",
        "__file": "src/views/orders/list.vue",
      },
      "meta": {
        "title": "Tagesabschluss",
        "icon": "fa-check",
        "inMenu": true
      }
    }
  ]
}

如果 inMenu 为 false,我希望不显示每条路线和子路线。

最佳答案

假设您希望所有对象都具有真正的 inMenu 属性,您可以使用新的子对象构建一个新数组。没有 true inMenu 项目的分支将被过滤掉。

function filter(array) {
    return array.reduce((r, { children = [], ...o }) => {
        children = filter(children);
        if (o.meta.inMenu || children.length) r.push(Object.assign({}, o, children.length && { children }));
        return r;
    }, [])
}

var data = [{ path: "/orders", meta: { icon: "fa-history", title: "Abwicklungen", inMenu: true }, children: [{ path: "list", name: "orderList", meta: { title: "Bestellliste", icon: "fa-circle-o", inMenu: true } }, { path: "details/:id", name: "orderDetails", meta: { title: "Bestellung", icon: "fa-circle-o", inMenu: false } }, { path: "dailyclosing", meta: { title: "Tagesabschluss", icon: "fa-check", inMenu: true } }] }, { path: "/orders", meta: { icon: "fa-history", title: "Abwicklungen", inMenu: false }, children: [{ path: "list", name: "orderList", meta: { title: "Bestellliste", icon: "fa-circle-o", inMenu: true } }, { path: "details/:id", name: "orderDetails", meta: { title: "Bestellung", icon: "fa-circle-o", inMenu: false } }, { path: "dailyclosing", meta: { title: "Tagesabschluss", icon: "fa-check", inMenu: true } }] }],
    result = filter(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 递归过滤 bool 键的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57426355/

相关文章:

javascript for...in 语句。排除第一次和最后一次迭代。并拆分循环12的倍数

javascript - 我想在用户关闭浏览器选项卡时将数据发布到 API

javascript - FullCalendar 在每个日期旁边添加 "undefined"

c++ - 递归创建——nested()

java - 波斯地毯递归

javascript - Jstree:无法读取未定义的属性子项。时间问题?

javascript - 创建面积图 : path with NaN

javascript - 在 JavaScript 中获取 bootstrap Datetimepicker 的值

javascript - 当按下模态外部时停止关闭模态

javascript - 无法在 JavaScript 中的 if 语句中返回值