普通数组转成树状数组(tree树形结构)详解(数组扁平化)

    // 方法一 常规思路 递归

   toTree(arr){

      // 这个就是一级数组 最后上面的数组只有三个是一级的

        const parentA = arr.filter(item => !item.parentId);

        const childA = arr.filter(item => item.parentId);

          /** 这个就是小蝌蚪找妈妈的具体实现,其实可以写在一个函数里面,

            但是为了易懂,就麻烦点儿摘出来一个函数 **/

        this.treeData(parentA, childA)

        return parentA;

    },

    treeData(parentA, childA) {

          for (const item of parentA) {

            item.children = []

            for (const i in childA) {

              const v = childA[i];

              if (item.id === v.parentId) {

                item.children.push(v);

                // 这一步递归 如果没有下面三行代码 只能找到第一级对应的children第二级目录

                let c = JSON.parse(JSON.stringify(childA)); // 简单深拷贝一下

                // 能走到这儿,说明这个娃 已经找到父亲了 不需要在遍历了 所以删了 你要是非的不删也可以

               // 注意这里是具体根据业务的,如果不同父目录下面可能有相同的子目录,这里就不能删除了

                c.splice(i, 1);

                // 这里需要把当前儿子 加上【】转为数组因为treeData接受的是父,子数组

                this.treeData([v], c);

              }

            }

          }

    },

方法二  扁平化处理(写成公共的方法)

// 调用 

 this.deptOptionsData = []

        this.deptOptionsData .push(...this.handleTree(response.data, "id"));

// 调用 结束

export function handleTree(data, id, parentId, children, rootId) {

 data = data.map(item => ({ ...item, parentId: item.parentId === "0" ? 0 : item.parentId }));

  id = id || 'id'

  parentId = parentId || 'parentId'

  children = children || 'children'

  rootId = rootId || Math.min.apply(Math, data.map(item => {

    return item[parentId]

  })) || 0

  //对源数据深度克隆

  const cloneData = JSON.parse(JSON.stringify(data))

  //循环所有项

  const treeData = cloneData.filter(father => {

    let branchArr = cloneData.filter(child => {

      //返回每一项的子级数组

      return father[id] === child[parentId]

    });

    branchArr.length > 0 ? father.children = branchArr : '';

    //返回第一层

    return father[parentId] === rootId;

  });

  return treeData !== '' ? treeData : data;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值