js 深拷贝与数组转树

本文介绍了一种使用JavaScript实现树状结构数据的方法。通过递归函数arrayToTree将扁平化的数组转换为树形结构,便于展示层级关系数据。文章还提供了一个具体的例子来演示如何创建学校、班级和学生之间的层次关系。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

</body>
</html>
<script>

  // 创建parentId的子节点,这个函数是没有创建根节点的其他信息的,只是创建了根节点的子节点数组,所以这个函数的返回值是一个数组
  function arrayToTree(data,parentId){
    let result = [];
    for(let i = 0; i < data.length; i++){ // 创建子节点列表
      if(data[i].parentId === parentId){
        let obj = deepClone(data[i]); // 深拷贝,创建一个子节点
        let children = []; // 子节点的子节点列表
        children = arrayToTree(data, data[i].id); // 递归创建子节点的子节点
        if(children.length > 0){ // 注意需求子节点为空时是否展示子节点
          obj.children = children; // 加上children字段
        }
        result.push(obj);
      }
    }
    return result;
  }

  // 深拷贝
  function deepClone(obj){
    if(!obj || typeof obj !== 'object'){
      return;
    }
    let newObj = Array.isArray(obj) ? [] : {};
    for(let key in obj){ // 遍历可枚举属性,包括原型链上的
      if(obj.hasOwnProperty(key)){
        newObj[key] = (typeof obj[key] === 'object') ? deepClone(obj[key]) : obj[key];
      }
    }
    return newObj;
  }

  let arrData = [
    {
      id: 1, val: '学校', parentId: 0, department:['部门1', '部门2']
    }, {
      id: 2, val: '班级1', parentId: 1
    }, {
      id: 3, val: '班级2', parentId: 1
    }, {
      id: 4, val: '学生1', parentId: 2
    }, {
      id: 5, val: '学生2', parentId: 2
    }, {
      id: 6, val: '学生3', parentId: 3
    },
  ];

  console.log(arrayToTree(arrData, 0));

</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值