第 1 题

640?wx_fmt=jpeg

问题:

       实现 convert 方法,把原始 list 转换成树形结构,要求尽可能降低时间复杂度。以下数据结构中,id 代表部门编号,name 是部门名称,parentId 是父部门编号,为 0 代表一级部门,现在要求实现一个 convert 方法,把原始 list 转换成树形结构,parentId 为多少就挂载在该 id 的属性 children 数组下,结构如下:

// 原始 list 如下	
let list =[	
    {id:1,name:'部门A',parentId:0},	
    {id:2,name:'部门B',parentId:0},	
    {id:3,name:'部门C',parentId:1},	
    {id:4,name:'部门D',parentId:1},	
    {id:5,name:'部门E',parentId:2},	
    {id:6,name:'部门F',parentId:3},	
    {id:7,name:'部门G',parentId:2},	
    {id:8,name:'部门H',parentId:4}	
];	
const result = convert(list, ...);	

	
// 转换后的结果如下	
let result = [	
    {	
      id: 1,	
      name: '部门A',	
      parentId: 0,	
      children: [	
        {	
          id: 3,	
          name: '部门C',	
          parentId: 1,	
          children: [	
            {	
              id: 6,	
              name: '部门F',	
              parentId: 3	
            }, {	
              id: 16,	
              name: '部门L',	
              parentId: 3	
            }	
          ]	
        },	
        {	
          id: 4,	
          name: '部门D',	
          parentId: 1,	
          children: [	
            {	
              id: 8,	
              name: '部门H',	
              parentId: 4	
            }	
          ]	
        }	
      ]	
    },	
  ···	
];

答案解析:

1. 为了降低时间复杂度,将数组转换为对象类型,便于快速获取操作对应元素;

function convert(list) {	
    var obj = {};	
    var result = [];	
    list.map(el => {	
        obj[el.id] = el;	
    })	
    for(let i=0, len = list.length; i < len; i++) {	
        let id = list[i].parentId;	
        if(id == 0) {	
            result.push(list[i]);	
            continue;	
        }	
        if(obj[id].children) {	
            obj[id].children.push(list[i]);	
        } else {	
            obj[id].children = [];	
            obj[id].children.push(list[i]);	
        }	
    }	
    return result;	
}	

	
let list = [	
    { id: 1, name: '部门A', parentId: 0 },	
    { id: 2, name: '部门B', parentId: 0 },	
    { id: 3, name: '部门C', parentId: 1 },	
    { id: 4, name: '部门D', parentId: 1 },	
    { id: 5, name: '部门E', parentId: 2 },	
    { id: 6, name: '部门F', parentId: 3 },	
    { id: 7, name: '部门G', parentId: 2 },	
    { id: 8, name: '部门H', parentId: 4 }	
];	

	
let result = convert(list);	
console.log(result);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值