扁平数据与树结构的相互转换

扁平数据转树结构的方法

思路:

1.对源数据先进行深拷贝,以免后续操作影响原数据

2.循环所有项,当遇到有数据的id等于其他数据的pid的时候,给当条数据添加children属性,并赋值

3.拿到最顶层pid=0的数据

   var data =
      [{ id: 1, pid: 0, name: '沃尔玛' },
      { id: 2, pid: 0, name: '生鲜区' },
      { id: 3, pid: 1, name: '日用品区' },
      { id: 4, pid: 2, name: '鱼' },
      { id: 5, pid: 2, name: '牛肉' },
      { id: 6, pid: 3, name: '卫生纸' },
      { id: 7, pid: 3, name: '牙刷' },
      { id: 8, pid: 7, name: '电动牙刷' },
      { id: 9, pid: 7, name: '普通牙刷' }];
      
    function setTreeData(source) {
      let cloneData = JSON.parse(JSON.stringify(source))      // 对源数据深度克隆
      return cloneData.filter(father => {                      // 循环所有项,并添加children属性
        let branchArr = cloneData.filter(child => father.id == child.pid);   // 返回每一项的子级数组
        branchArr.length > 0 ? father.children = branchArr : ''   //给父级添加一个children属性,并赋值
        return father.pid == 0;      //返回第一层
      });
    }
    console.log(setTreeData(data));

树结构转扁平数据的方法

思路:

1.利用解构拿到传过来的树结构的children数据和非children数据

2.将非children数据添加到数组中

3.将children数据通过递归的方法再一次调用

4.这样最终结果返回的就是没有children的扁平数据

   const tree = [
      { id: "1", rank: 1 },
      {
        id: "2", rank: 1,
        children: [
          { id: "2.1", rank: 2 },
          { id: "2.2", rank: 2 }
        ]
      },
      {
        id: "3", rank: 1,
        children: [
          {
            id: "3.1", rank: 2,
            children: [
              {
                id: '3.1.1', rank: 3,
                children: [
                  {
                    id: "3.1.1.1", rank: 4,
                    children: [
                      { id: "3.1.1.1.1", rank: 5 }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
    
    
    function flattenArr(tree, arr = []) {
      tree.forEach((item) => {
        const { children, ...otherProps } = item
        // 添加除了children的属性
        arr.push(otherProps)
        if (children) {
          // 递归将所有节点加入到结果集中
          flattenArr(children, arr)
        }
      })
      return arr
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值