请问js多层对象数组怎么遍历

新手上路,请多包涵
var arr = [
    {
      "id": 1,
      "name": "个人设置",
      "path": "/service",
      "children":[]
    },
    {
      "id": 2,
      "name": "系统设置",
      "path": "/service",
      "children": [
          {
              "id": 3,
              "name": "权限管理",
              "children": [
                  {
                      "id": 4,
                      "name": "菜单管理",
                      "path": "/service/menu/index",
                  },
                  {
                      "id": 5,
                      "name": "用户管理",
                      "path": "/service/user/index",
                  },
                  {
                      "id": 6,
                      "name": "角色管理",
                      "path": "/service/role/index",
                  },
                  {
                      "id": 7,
                      "name": "工作流",
                      "path": "/service/workflow/index",
                  }
              ]
          },
          {
              "id": 11,
              "name": "常用设置",
              "path": "serivce/fenlei/index",
              "children": [
                  {
                      "id": 10,
                      "name": "分类管理",
                      "path": "/service/fenlei/index",
                  }
              ]
          }
      ]
    }
  ]

这样的数组 我是这么遍历出来的

var title = '';
for(var i in arr){
    if(arr[i].children){
      for(var j in arr[i].children){
        if(arr[i].children[j].path == 'serivce/fenlei/index'){
          title = arr[i].children[j].name
        }
      }
    }
  }

请问怎么优化一下啊,或者用其他方法也行

阅读 2.4k
2 个回答
const forEach = (node, fn, leafOnly) => {
    if (! node.children || ! leafOnly) if (fn(node)) return true
    if (node.children) for (const child of node.children) {
        if (forEach(child, fn, leafOnly)) return true
    }
}
forEach({ children: arr }, node => {
    if (node.path === 'serivce/fenlei/index') {
        title = node.name
        return true // break
    }
})

试下广度优先、深度优先遍历。

let i = 0;
let title = "";
while (i < arr.length){
    if(arr[i]["path"] === "serivce/fenlei/index"){
        title = arr[i]["name"];
        break
    }
    let child = arr[i]["children"];
    if(child && child.length > 0){
        arr.push(...child);
    }
    i++;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题