js无限分类递归树

首先了解一下什么是无限分类递归树(树形分类),如下示例:

    const arr = [
      { id: 1, pid: 0, name: '1' },
      { id: 2, pid: 0, name: '2' },
      { id: 3, pid: 1, name: '3' },
      { id: 4, pid: 3, name: '4' },
      { id: 5, pid: 4, name: '5' },
      { id: 6, pid: 2, name: '6' },
      { id: 7, pid: 6, name: '7' },
    ]

         如上有一个数组对象,每个对象由id、pid、name三个属性组成;那怎么将他们转换成树状呢?

        首先id是依次递增的,当pid的值等于id值时,就是该id的儿子,用一个children数组去存储这个对象,依次下去如下:

    let newArr = [
      {
        id: 1,
        pid: 0,
        name: '1',
        children: [
          {
            id: 3,
            pid: 1,
            name: '3',
            children: [
              {
                id: 4,
                pid: 3,
                name: '4',
                children: [
                  {
                    id: 5,
                    pid: 4,
                    name: '5',
                  },
                ],
              },
            ],
          },
        ],
      },
      {
        id: 2,
        pid: 0,
        name: '2',
        children: [
          {
            id: 6,
            pid: 2,
            name: '6',
            children: [
              {
                id: 7,
                pid: 6,
                name: '7',
              },
            ],
          },
        ],
      },
    ]

代码如下:

    function setTreeData(data, str = 0) {
      return data.filter((item) => {
        if (item.pid === str) {
          item.children = setTreeData(data, item.id)
          return true
        }
      })
    }
    console.log(setTreeData(arr))

代码解析:

  1. 先定义一个函数来进行封装
  2. 然后利用数组filter方法进行筛选这个数组,filter返回的是筛选好的新数组
  3. 进行判断,由于第一层的pid值需为0,所以str默认参数就设置为0(即str=0
  4. 如果pid为0就给该对象添加一个children属性(该属性值为数组
  5. 由于pid等于id就是此id的儿子,所以再次调用该函数找出pid等于id的对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值