js扁平数组数组改为树形结构数据

数组转成树形结构数据

做项目遇到了好多次数组转成树形结构数据,于是总结了一下自己查到的没查到的方法:

// 原数据
let arr = [{
          id: 1,
          parentId: 0
         },
         {
           id: 2,
           parentId: 0
         },
         {
           id: 3,
           parentId: 0
         },
         {
           id: 4,
           parentId: 0
         },
         {
           id: 5,
           parentId: 0
         },
         {
           id: 6,
           parentId: 0
         },
         {
           id: 8,
           parentId: 1
         },
         {
           id: 9,
           parentId: 1
         },
         {
           id: 10,
           parentId: 1
         },
         {
           id: 11,
           parentId: 2
         },
         {
           id: 12,
           parentId: 9
         }];
// 理想数据
[
    {
        "id": 1,
        "parentId": 0,
        "children": [
            {
                "id": 8,
                "parentId": 1
            },
            {
                "id": 9,
                "parentId": 1,
                "children": [
                    {
                        "id": 12,
                        "parentId": 9
                    }
                ]
            },
            {
                "id": 10,
                "parentId": 1
            }
        ]
    },
    {
        "id": 2,
        "parentId": 0,
        "children": [
            {
                "id": 11,
                "parentId": 2
            }
        ]
    },
    {
        "id": 3,
        "parentId": 0
    },
    {
        "id": 4,
        "parentId": 0
    },
    {
        "id": 5,
        "parentId": 0
    },
    {
        "id": 6,
        "parentId": 0
    }
]
通过循环遍历实现
	// for循环
     getTree(list) {
       let cloneList = JSON.parse(JSON.stringify(list)); // 对源数据深度克隆
       return cloneList.filter(parent => { // 循环所有项,如果条件符合,添加children属性
         let cloneArr = cloneList.filter(child => parent.id === child.parentId); // 返回每一项子级数组
         if (cloneArr.length > 0) {
           parent.children = cloneArr;
         }
         return parent.parentId === 0;
       });
     },
	// 使用
	console.log(this.getTree(arr));
通过递归实现
	// 递归
 	getTree(list, pid) {
       let cloneList = JSON.parse(JSON.stringify(list));
       let temp = [];
       cloneList.forEach(item => {
         if (item.parentId === pid) {
           const children = this.getTree(cloneList, item.id);
           if (children && children.length > 0) {
             item.children = children;
           }
           temp.push(item);
         }
       });
       return temp;
     },
	//使用
	console.log(this.getTree(arr, 0));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值