平面转树形,树形转平面通用函数

1.平面数组转树形数组

工作中,经常会用到平面数组转树形数组,树形转平面的数组,每次遇到一个项目,都要写一次很麻烦,直接写个通用函数,调用传参直接使用即可。

函数如下:

    function planeToTree(planeList, parentId = null, idKey = 'id', parentKey = 'parentId', childrenKey = 'children') {
      const treeList = []
      for (let i = 0; i < planeList.length; i++) {
        const node = planeList[i]
        if (node[parentKey] === parentId) {
          const children = planeToTree(planeList, node[idKey], idKey, parentKey, childrenKey)
          if (children.length > 0) {
            node[childrenKey] = children
          }
          treeList.push(node)
        }
      }
      return treeList
    }

传参解释:

planeList 参数表示待转换的平面数据列表;

parentId 参数表示当前节点的父级节点 ID,默认为 null;

idKeyparentKey 分别表示节点 ID 和父级节点 ID 在数据中的属性名,默认分别为 'id' 和 'parentId';

childrenKey 表示子节点在数据中的属性名,默认为 'children'。

举个例子:

let arr = [
      {
        "deptId": 1,
        "parentId": 0,
        "deptName": "总公司",
      },
      {
        "deptId": 2,
        "parentId": 1,
        "deptName": "合肥总公司",
      },
      {
        "deptId": 3,
        "parentId": 1,
        "deptName": "南京分公司",
      },
      {
        "deptId": 4,
        "parentId": 2,
        "deptName": "研发部门",
      },
      {
        "deptId": 5,
        "parentId": 2,
        "deptName": "市场部门",
      },
      {
        "deptId": 6,
        "parentId": 2,
        "deptName": "生产1部",
      },
      {
        "deptId": 7,
        "parentId": 2,
        "deptName": "生产2部",
      },
      {
        "deptId": 8,
        "parentId": 2,
        "deptName": "运维部门",
      },
      {
        "deptId": 9,
        "parentId": 3,
        "deptName": "市场部门",
      },
      {
        "deptId": 10,
        "parentId": 3,
        "deptName": "财务部门",
      }
    ]
    console.log(planeToTree(arr, 0, 'deptId', 'parentId', 'children'))

 2.树形数组转平面数组

 函数如下:

   function flattenTree(tree, key = 'id', childrenKey = 'children', parentId = null) {
      return tree.reduce((acc, node) => {
        const newNode = { ...node };
        newNode.parentId = parentId;
        acc.push(newNode);
        if (newNode[childrenKey]) {
          const children = flattenTree(newNode[childrenKey], key, childrenKey, newNode[key]);
          acc.push(...children);
          delete newNode[childrenKey];
        }
        return acc;
      }, []);
    }

传参解释:

tree:要转换为平面结构的树状结构数组。

key(可选):树中每个节点的唯一标识符属性名称。默认为 'id'。

childrenKey(可选):树中每个节点下一级子节点的属性名称。默认为 'children'。

parentId(可选):父节点的唯一标识符。默认为 null。

举个例子:

    let arr = [
      {
        "id": 1,
        "parentId": 0,
        "label": "总公司",
        "child": [
          {
            "id": 2,
            "parentId": 1,
            "label": "南京分公司",
            "child": [
              {
                "id": 4,
                "parentId": 2,
                "label": "研发部门"
              },
              {
                "id": 5,
                "parentId": 2,
                "label": "市场部门"
              },
              {
                "id": 6,
                "parentId": 2,
                "label": "生产1部"
              },
              {
                "id": 7,
                "parentId": 2,
                "label": "生产2部"
              },
              {
                "id": 8,
                "parentId": 2,
                "label": "运维部门"
              }
            ]
          },
          {
            "id": 3,
            "parentId": 1,
            "label": "苏州分公司",
            "child": [
              {
                "id": 9,
                "parentId": 3,
                "label": "市场部门"
              },
              {
                "id": 10,
                "parentId": 3,
                "label": "财务部门"
              }
            ]
          }
        ]
      }
    ]

console.log(flattenTree(arr, 'id', 'child', 0))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值