单层数据结构转树级结构

// 第一种方法
// 定义一个单层数据结构
let data = [
    {
        id: 1,
        parentId: 0
    },
    {
        id: 2,
        parentId: 0
    },
    {
        id: 3,
        parentId: 1
    },
    {
        id: 4,
        parentId: 1
    },
    {
        id: 5,
        parentId: 2
    },
    {
        id: 6,
        parentId: 4
    }
];

// 定义一个函数,将单层数据结构转换为树结构
function convertToTree(data) {
    let tree = [];
    data.forEach(item => {
        let parentId = item.parentId;
        if (parentId === 0) {
            tree.push(item);
        } else {
            data.forEach(parentItem => {
                if (parentItem.id === parentId) {
                    if (parentItem.children) {
                        parentItem.children.push(item);
                    } else {
                        parentItem.children = [item];
                    }
                }
            });
        }
    });
    return tree;
}

// 调用函数,将单层数据结构转换为树结构
let tree = convertToTree(data);
console.log(tree);



//第二种方法

convertFun(data) {
      // 1.定义最外层的数组
      const tree = []
      // 2.定义一个空对象
      const otherObj = {}
      // 3.遍历数组内所有对象
      data.forEach(item => {
        // 3.1.给每个当前对象添加一个 children 属性, 以便存放子级对象
        item.children = []
        // 3.2 将当前对象的 id 作为键, 与当前对象自身形成键值对
        otherObj[item.id] = item
      })
      // 4.再次遍历数组内所有对象
      data.forEach(item => {
        // 4.1.判断每个当前对象的 parentId, 如当前对象 parentId不为空, 则说明不是上级的根对象
        if (item.parentId) {
          // 4.3.利用当前对象的 otherObj[parentId] 找到 otherObj[id] 中对应当前对象的父级对象, 将当前对象添加到其对应的父级对象的 children 属性中
          otherObj[item.parentId].children.push(item)
        } else {
          // 4.3.当前对象 parentId如果为空, 则为树状结构的根对象
          tree.push(item)
        }
      })

      tree.sort((a, b) => a.sortNumber - b.sortNumber)
      // 5.返回树状结构
      return tree
    },

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

段忠亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值