将普通数据处理成树结构数据

一、核心代码
  /**
   * @description: 递归将普通数据(可以有关系,也可以无关系)处理成树结构
   * nodeList: 普通节点数据列表
   * cNode: 当前节点
   * params: 格式化的字段
   * params.id: 当前节点对应的节点id
   * params.pId: 当前节点对应的父节点id
   * params.name: 当前节点对应的节点名称
   * params.pName: 当前节点对应的对应的父节点名称
   */
  function recursionTreeData(
    nodeList = [],
    cNode,
    params = { id: 'id', pId: 'pId', name: 'name', pName: 'pName' },
  ) {
    let temp = [].concat(nodeList)
    if (cNode) {
      for (let i = 0; i < temp.length; i++) {
        if (cNode.id === temp[i][params.pId]) {
          let opt = {
            id: temp[i][params.id],
            pId: temp[i][params.pId],
            name: temp[i][params.name],
            pName: temp[i][params.pName],
            children: [],
          }

          temp.splice(i, 1)
          i--

          opt.children = recursionTreeData(temp, opt)

          cNode.children.push(opt)
        }
      }

      return cNode.children
    } else {
      let treeData = []

      for (let i = 0; i < temp.length; i++) {
        if (!temp[i][params.pId] || temp[i][params.pId] < 0) {
          let opt = {
            id: temp[i][params.id],
            pId: temp[i][params.pId],
            name: temp[i][params.name],
            pName: temp[i][params.pName],
            children: [],
          }

          temp.splice(i, 1)
          i--

          opt.children = recursionTreeData(temp, opt)
          treeData.push(opt)
        }
      }
      return treeData
    }
  }
二、示例代码
  let arr = [
    {
      id: 610,
      pId: null,
      name: '陕西省',
      pName: null,
    },
    {
      id: 610100000000,
      pId: 610,
      name: '西安市',
      pName: '陕西省',
    },
    {
      id: 610200000000,
      pId: 610,
      name: '铜川市',
      pName: '陕西省',
    },
    {
      id: 610300000000,
      pId: 610,
      name: '宝鸡市',
      pName: '陕西省',
    },
    {
      id: 110100000000,
      pId: null,
      name: '北京市',
      pName: null,
    },
    {
      id: 110101000000,
      pId: 110100000000,
      name: '东城区',
      pName: '北京市',
    },
    {
      id: 110102000000,
      pId: 110100000000,
      name: '西城区',
      pName: '北京市',
    },
  ]

  console.log(recursionTreeData(arr))
三、示例结果
[
    {
        "id": 610,
        "pId": null,
        "name": "陕西省",
        "pName": null,
        "children": [
            {
                "id": 610100000000,
                "pId": 610,
                "name": "西安市",
                "pName": "陕西省",
                "children": []
            },
            {
                "id": 610200000000,
                "pId": 610,
                "name": "铜川市",
                "pName": "陕西省",
                "children": []
            },
            {
                "id": 610300000000,
                "pId": 610,
                "name": "宝鸡市",
                "pName": "陕西省",
                "children": []
            }
        ]
    },
    {
        "id": 110100000000,
        "pId": null,
        "name": "北京市",
        "pName": null,
        "children": [
            {
                "id": 110101000000,
                "pId": 110100000000,
                "name": "东城区",
                "pName": "北京市",
                "children": []
            },
            {
                "id": 110102000000,
                "pId": 110100000000,
                "name": "西城区",
                "pName": "北京市",
                "children": []
            }
        ]
    }
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值