js数组与树结构相互转换

  1. 数组转为树结构
     

    const data = [
      { id: "01", lable: "项目经理", pid: "" },
    
      { id: "02", lable: "产品leader", pid: "01" },
    
      { id: "03", lable: "UIleader", pid: "01" },
    
      { id: "04", lable: "技术leader", pid: "01" },
    
      { id: "05", lable: "测试leader", pid: "01" },
    
      { id: "06", lable: "运维leader", pid: "01" },
    
      { id: "07", lable: "产品经理", pid: "02" },
    
      { id: "08", lable: "产品经理", pid: "02" },
    
      { id: "09", lable: "UI设计师", pid: "03" },
    
      { id: "10", lable: "前端工程师", pid: "04" },
    
      { id: "11", lable: "后端工程师", pid: "04" },
    
      { id: "12", lable: "后端工程师", pid: "04" },
    
      { id: "13", lable: "测试工程师", pid: "05" },
    
      { id: "14", lable: "测试工程师", pid: "05" },
    
      { id: "15", lable: "运维工程师", pid: "06" },
    ];
    let d = dataTotree(data)
    console.log(d,'d')
    function dataTotree(data) {
      let tree = []
      let obj = {}
      data.forEach(v => {
        v.children = []
        obj[v.id] = v
      })
    
      data.forEach(v => {
        if(v.pid) {
          obj[v.pid].children.push(v)
        } else {
          tree.push(v)
        }
      })
      return tree
    }

  2. 树结构转为数组

     

    
    let node = {
      "id": "1",
      "pId": "0",
      "sysTypePreCode": null,
      "sysTypeCode": "100",
      "sysTypeName": "常规自动气象站",
      "sysTypeAlias": "常规自动站",
      "levelCode": "0",
      "orderNo": 1,
      "children": [
          {
              "id": "2",
              "pId": "1",
              "sysTypePreCode": null,
              "sysTypeCode": "100001",
              "sysTypeName": "国家自动站",
              "sysTypeAlias": "国家自动站",
              "levelCode": "1",
              "orderNo": 1,
              "children": [
                  {
                      "id": "432199690159652864",
                      "pId": "2",
                      "sysTypePreCode": null,
                      "sysTypeCode": "100001001",
                      "sysTypeName": "气候气象站",
                      "sysTypeAlias": "气候站",
                      "levelCode": "3",
                      "orderNo": 1,
                      "children": [],
                      "obserElements": [],
                      "pid": 2
                  },
                  {
                      "id": "432214459457470464",
                      "pId": "2",
                      "sysTypePreCode": null,
                      "sysTypeCode": "100001002",
                      "sysTypeName": "基准气象站",
                      "sysTypeAlias": "基准站",
                      "levelCode": "3",
                      "orderNo": 1,
                      "children": [],
                      "obserElements": [],
                      "pid": 2
                  },
                  {
                      "id": "432235171438133248",
                      "pId": "2",
                      "sysTypePreCode": null,
                      "sysTypeCode": "100001003",
                      "sysTypeName": "一般气象站",
                      "sysTypeAlias": "一般站",
                      "levelCode": "2",
                      "orderNo": 1,
                      "children": [],
                      "obserElements": [],
                      "pid": 2
                  }
              ],
              "obserElements": [
                  {
                      "id": "0",
                      "obserEleCode": "1306006",
                      "obserEleAlias": "过去6小时降水量",
                      "obserEleName": "PRE_6H",
                      "obserSysId": 436565689684197400,
                      "obserProId": null,
                      "obserProCode": null
                  },
                  {
                      "id": "0",
                      "obserEleCode": "1306005",
                      "obserEleAlias": "过去3小时降水量",
                      "obserEleName": "PRE_3H",
                      "obserSysId": 436565689684197400,
                      "obserProId": null,
                      "obserProCode": null
                  }
              ],
              "pid": 1
          },
          {
              "id": "3",
              "pId": "1",
              "sysTypePreCode": null,
              "sysTypeCode": "100002",
              "sysTypeName": "类区域站",
              "sysTypeAlias": "类区域站",
              "levelCode": "1",
              "orderNo": 2,
              "children": [],
              "obserElements": [],
              "pid": 1
          }
      ],
      "obserElements": [],
      "pid": 0
    }
    
    console.log(treeToarr(node))
    function treeToarr(node) {
      let queue = [node]
      let data = []
      while(queue.length !== 0) {
        let item = queue.shift()
        data.push({
          id: item.id,
          name: item.name,
          parentId: item.parentId
        })
        let children = item.children
        if(children) {
          children.forEach(v => { 
            queue.push(v)
          })
        }
      }
      return data
    }
    
    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值