算法打卡day2——数组转树形结构

46 阅读1分钟

数据如下:

var menu_list = [{
    id: '1',
    menu_name: '设置',
    menu_url: 'setting',
    parent_id: 0
   }, {
    id: '1-1',
    menu_name: '权限设置',
    menu_url: 'setting.permission',
    parent_id: '1'
   }, {
    id: '1-1-1',
    menu_name: '用户管理列表',
    menu_url: 'setting.permission.user_list',
    parent_id: '1-1'
   }, {
    id: '1-1-2',
    menu_name: '用户管理新增',
    menu_url: 'setting.permission.user_add',
    parent_id: '1-1'
   }, {
    id: '1-1-3',
    menu_name: '角色管理列表',
    menu_url: 'setting.permission.role_list',
    parent_id: '1-1'
   }, {
    id: '1-2',
    menu_name: '菜单设置',
    menu_url: 'setting.menu',
    parent_id: '1'
   }, {
    id: '1-2-1',
    menu_name: '菜单列表',
    menu_url: 'setting.menu.menu_list',
    parent_id: '1-2'
   }, {
    id: '1-2-2',
    menu_name: '菜单添加',
    menu_url: 'setting.menu.menu_add',
    parent_id: '1-2'
   }, {
    id: '2',
    menu_name: '订单',
    menu_url: 'order',
    parent_id: 0
   }, {
    id: '2-1',
    menu_name: '报单审核',
    menu_url: 'order.orderreview',
    parent_id: '2'
   }, {
    id: '2-2',
    menu_name: '退款管理',
    menu_url: 'order.refundmanagement',
    parent_id: '2'
   }
 ]

要求:根据id关系添加children属性,并构造树形结构

思路一:递归

const buildTree = (arr, parentid, children_list) => { //在arr里找父亲id是parentid的成员并把它加到父亲的孩子列表里

//找到指定父亲的所有孩子
    for (let i of arr) {
        if (i.parent_id == parentid) {
            children_list.push(i);
        }
    }

//开始递归
    for (let i of children_list) {
        i.children = [];
        buildTree(arr, i.id, i.children);
        if (i.children.length == 0) {
            delete i.children;
        }
    }
    return children_list; //返回的最终树形结构相当于id为0的祖宗
}

思路二:迭代

const buildTree = (arr) => {
    tmp = {};
    res = {};
    
//先将数组中的元素处理成 `id: {id:,menu_name:,menu_url:,parent_id:,}` 格式
    for (let i in arr) {
        tmp[arr[i].id] = arr[i];
    }
    
//为每个孩子找他的父亲
    for (let i in tmp) {
        if (tmp[i].parent_id) { 
            if (!tmp[tmp[i].parent_id].children) {
                tmp[tmp[i].parent_id].children = new Object();
            }
            tmp[tmp[i].parent_id].children[tmp[i].id] = tmp[i];
        } else {
            res[tmp[i].id] = tmp[i];
        }
    }
    return res;
}

总结:第一种思路是一次性找到某个父亲的所有孩子;第二种思路是遇到个孩子就先找他的父亲