【面试题】JS 数组转换成树形结构

256 阅读1分钟

一、题目描述

实现 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}
];

// 转换后的
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
          }
        ]
      }
    ]
  },
  ...
];

// 实现
const convert = (list) => {

}

二、思路分析

  1. 如果parentId为0,那么就之间push
  2. 定义了一个map对象,来存储每个元素,目的是为了可以找到父级

三、代码答案

const convert = (list) => {
  const result = []
  const map = {}
  list.forEach(item => {
    map[item.id] = item
    item.children = []
    if (item.parentId === 0) {
      result.push(item)
    } else {
      const parent = map[item.parentId]
      parent.children.push(item)
    }
  });
  return result
}

希望可以告知更多的方法~欢迎评论