数组结构转换

怎样将一个平铺的数组结构转换成一个树形的数组结构

在前端处理后台发送过来的数据时,后端接口返回的数据一般是平铺的数组结构,而不会是树形结构,例如下面的平铺数组结构:

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: "运维工程师"
      }
    ]

此类的数据可以在table中使用,但不能直接在tree组件中使用,要使用的话需要做一些转换,变成树状的数组结构。

data: [{
        label: '张大大',
        children: [
          {
          	label: '小亮',
          	children: [{label: '小丽'}{label: '大光'}]
        	},
          {
          	label: '小美',
          	children: [{label: '小高'}]
        	},
          {
          	label: '老马',
          	children: [{label: '小刘'}{label: '小华'},{label: '小李'}]
        	},
          {
          	label: '老王',
          	children: [{label: '小赵'}{label: '小强'}]
        	},
          {
          	label: '老李',
          	children: [{label: '小涛'}]
        	}
      	]
      }]
``
可以使用双重循环遍历
在第一次循环id值,第二次循环pid值

    function toTree(data) {
      // 空数组
      let result = [];
      // 判断不是数组  直接返回
      if (!Array.isArray(data)) {
        return result
      }
      // 遍历  删除  children 属性  做初始化操作
      data.forEach(item => {
        delete item.job
        item.label = item.name
        delete item.name
      });
      //  空对象
      let map = {};
      data.forEach(item => {
        map[item.id] = item;
      });
      data.forEach(item => {
        // item.pid 为0时 返回underfined
        let parent = map[item.pid];
        if (parent) {
          (parent.children || (parent.children = [])).push(item);
        } else {
          // 这里push的item是pid为0的数据
          result.push(item);
        }
      });
      return result;
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值