实现 convert 方法,把原始 list 转换成树形结构,要求尽可能降低时间复杂度

252 阅读1分钟

实现的步骤,先把最外层的拿到res数组里面(也就是parentId为0)作为第一层,将其转化为map,遍历每一个对象的prentId=id,将其item项push到id一样的children数组里面,实现树形结构

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
}];
// 时间复杂度O(n)
function convert(list) {
    const res = []
    // console.log(list,'list');
    // 将数组转换成对象
    const map = list.reduce((res, v) = >(res[v.id] = v, res), {}) console.log(map, 'map');
    for (const item of list) {
        // console.log(item);
        // 将parentId=0的先push进res数组里面
        if (item.parentId === 0) {
            res.push(item) continue
        }
        //筛选出其他的parentId,1,2,3,4,
        if (item.parentId in map) {
            console.log(item.parentId, '父id')
            // 拿到id与parentId相等的
            const parent = map[item.parentId] console.log(map[item.parentId])
            // 将parentId这一项(item)添加到id一样的里面children,如果没有就给空数组
            parent.children = parent.children || [] parent.children.push(item)
        }
    }
    return res
}
const result = convert(list) console.log(result);