实现数组转换为有层级的对象的方法

394 阅读2分钟

实现数组转换为有层级的对象

const data = [
  { id: '01', name: '张大大', pid: '', job: '项目经理' },
  { id: '02', name: '小亮', pid: '01', job: '产品leader' },
  { id: '03', name: '小美', pid: '01', job: 'UIleader' },
  { id: '04', name: '老马', pid: '01', job: '技术leader' },
  { id: '05', name: '老王', pid: '01', job: '测试leader' },
  { id: '06', name: '老李', pid: '01', job: '运维leader' },
  { id: '07', name: '小丽', pid: '02', job: '产品经理' },
  { id: '08', name: '大光', pid: '02', job: '产品经理' },
  { id: '09', name: '小高', pid: '03', job: 'UI设计师' },
  { id: '10', name: '小刘', pid: '04', job: '前端工程师' },
  { id: '11', name: '小华', pid: '04', job: '后端工程师' },
  { id: '12', name: '小李', pid: '04', job: '后端工程师' },
  { id: '13', name: '小赵', pid: '05', job: '测试工程师' },
  { id: '14', name: '小强', pid: '05', job: '测试工程师' },
  { id: '15', name: '小涛', pid: '06', job: '运维工程师' }
]


转换为 :

const treeData = [
				// treeData就是:
				{
					label: '张大大',
					children: [
						{
							label: '小亮',
							children: [{ label: '小丽' }, { label: '大光' }],
						},
						{
							label: '小美',
							children: [{ label: '小高' }],
						},
						{
							label: '老马',
							children: [{ label: '小刘' }, { label: '小华' }, { label: '小李' }],
						},
						{
							label: '老王',
							children: [{ label: '小赵' }, { label: '小强' }],
						},
						{
							label: '老李',
							children: [{ label: '小涛' }],
						},
					],
				},
			]

方法一 递归

function dataToChange(data, pid) {
    const tree = []
    let tem = ''

    for (let i = 0; i < data.length; i++) {
      // console.log(data[i].pid)
      if (data[i].pid === pid) {
        const obj = {}

        for (const k in data[i]) {
          obj[k] = data[i][k]
        }

        tem = dataToChange(data, data[i].id) // tem 是空数组或者是二级的元素
        if (tem.length > 0) {
        // 判断 如果头长度 则是二级 ,插入到一级子节点中
          obj.children = tem
        }
        tree.push(obj)
      }
      // console.log(data[i].id)
    }
    return tree

image.png

方法二:

function dataToChange(data) {
  // 1. 定义两个变量
  const tree = [], map = {}

  // 2. 建立一个映射关系,并给每个元素补充children属性.
  // 映射关系: 目的是让我们能通过id快速找到对应的元素
  // 补充children:让后边的计算更方便
  list.forEach(item => {
    if (!item.children) {
      item.children = []
    }
    map[item.id] = item
  })

  // 循环
  list.forEach(item => {
    // 对于每一个元素来说,先找它的上级
    //    如果能找到,说明它有上级,则要把它添加到上级的children中去
    //    如果找不到,说明它没有上级,直接添加到 treeList
    const parent = map[item.pid]
    // 如果存在上级则表示item不是最顶层的数据
    if (parent) {
      parent.children.push(item)
    } else {
      // 如果不存在上级 则是顶层数据,直接添加
      treeList.push(item)
    }
  })
  // 返回
  return tree
}