js 一维数组生成树结构

// 数据0-length,必须一层一层往后堆叠。
// 第一层默认根节点,之后第二层为第一层所有children
// 第三层为第二层所有children,依次堆叠
const dataOrin = [
  { code: '1', parentCode: null },
  { code: '2', parentCode: null },
  { code: '3', parentCode: null },
  { code: '1-1', parentCode: '1' },
  { code: '1-2', parentCode: '1' },
  { code: '1-3', parentCode: '1' },
  { code: '1-4', parentCode: '1' },
  { code: '1-5', parentCode: '1' },
  { code: '2-1', parentCode: '2' },
  { code: '2-2', parentCode: '2' },
  { code: '2-3', parentCode: '2' },
  { code: '2-4', parentCode: '2' },
  { code: '2-5', parentCode: '2' },
  { code: '3-1', parentCode: '3' },
  { code: '3-2', parentCode: '3' },
  { code: '3-3', parentCode: '3' },
  { code: '3-4', parentCode: '3' },
  { code: '3-5', parentCode: '3' },
  { code: '1-1-1', parentCode: '1-1' },
  { code: '1-1-2', parentCode: '1-1' },
  { code: '1-1-3', parentCode: '1-1' },
  { code: '1-1-4', parentCode: '1-1' },
  { code: '1-2-1', parentCode: '1-2' },
  { code: '1-2-2', parentCode: '1-2' },
  { code: '1-2-3', parentCode: '1-2' },
  { code: '1-3-1', parentCode: '1-3' },
  { code: '1-3-2', parentCode: '1-3' },
  { code: '3-1-1', parentCode: '3-1' },
  { code: '3-1-2', parentCode: '3-1' },
  { code: '3-1-3', parentCode: '3-1' },
  { code: '3-1-4', parentCode: '3-1' },
]

// 采用递归,生成
function getTree() {
  const treeData = []
  
  const dfs = function (data, parentObj) {
    const currentObj = {}
    let index = 0
    while (true) {
      const current = data[index]

      if (current && !current.parentCode) {
        // 初始根节点
        currentObj[current.code] = current
        treeData.push(current)

      } else if (current && parentObj[current.parentCode]) {
        // 判断parentCode是否存在,如果不存在,进入下一层

        // 为父级对象赋值children
        if (parentObj[current.parentCode].children) {
          parentObj[current.parentCode].children.push(current)
        } else {
          // 初始化children
          parentObj[current.parentCode].children = [current]
        }
        // 记录当前层对象
        currentObj[current.code] = current

      } else {
        // 当前值父级不存在时,说明是祖父关系,下一次递归,才是父子关系
        break
      }

      index++
    }

    // 删除遍历过的数据,继续下一层遍历
    const newArr = data.slice(index, data.length)

    if (newArr.length > 1) {
      // 返回带有children的currentObj
      dfs(newArr, currentObj)
    } else {
      // 数组遍历完成,return
      return
    }

  }

  dfs(dataOrin, {})

  return treeData
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值