從數據庫取出自關聯數據后,遞歸成樹形json


功能需求:從數據庫里取出帶有id和父級id關系的表里的全部數據,經過服務端處理成樹形分層的json,返回給前端插件顯示多級結構。

核心步驟:將取出的數據根據每行的id處理成相同格式的數組形式以后進行遞歸,沒有父級id的作為根節點層,有父級id的講自己寫為父級的子級層

示例如下:


var getRiskJson = function (data,callback){
        console.log("getRiskJson data length:"+data.length);
            var riskTree = {};
            var riskdata = {}; //risks
            for(var i in data){
                var row = data[i];
                riskdata[row.id] = row;
            }
            for(var i in riskdata){
                // console.log(riskdata[i]);
                makeRiskTree(riskTree,riskdata,riskdata[i]);
            }
            callback(riskTree);
}

function makeRiskTree(risktree,risks,risk) { //樹 正在堆的父級 子集
    if(!risk.sub){//如果本條沒有子集 添加本條
        risk.sub =  {};
    }
    if(risk.super_id){ //如果有父級 就取出自己做成父級的數組形式
        var super_id = risks[risk.super_id];
        console.log('now super_id,risk.super_id are:'+super_id+"———n(*≧▽≦*)n———"+risk.super_id);
        makeRiskTree(risktree,risks,super_id);
        super_id.sub[risk.id] = risk;
    }else{ //若沒有父級 則自己就是根節點
        risktree[risk.id]= risk;
    }
};

 

 

//測試數據
var data = [
  {
    "id": "0013bf81-1f4f-4a8b-8900-c894d4afd890",
    "super_id": null,
    "level": "1",
    "content": "配電",
    "status": "1",
    "createdAt": null,
    "updatedAt": null,
    "parentContent": null
  },
  {
    "id": "00b0bd76-a9be-4f1e-94ea-6847090e8a55",
    "super_id": null,
    "level": "1",
    "content": "變電",
    "status": "1",
    "createdAt": null,
    "updatedAt": null,
    "parentContent": null
  },
  {
    "id": "1111181-1f4f-4a8b-8900-c894d4afd890",
    "super_id": "2213bf81-1f4f-4a8b-8900-c894d4afd890",
    "level": "4",
    "content": "過往行人進入作業現場",
    "status": "1",
    "createdAt": "2017-03-08T07:42:20.000Z",
    "updatedAt": "2017-03-25T07:42:24.000Z",
    "parentContent": "帶電斷、接引線"
  },
  {
    "id": "1113bf81-1f4f-4a8b-8900-c894d4afd890",
    "super_id": "0013bf81-1f4f-4a8b-8900-c894d4afd890",
    "level": "2",
    "content": "配電帶電作業",
    "status": "1",
    "createdAt": null,
    "updatedAt": null,
    "parentContent": "配電"
  },
  {
    "id": "11b0bd76-a9be-4f1e-94ea-6847090e8a55",
    "super_id": "00b0bd76-a9be-4f1e-94ea-6847090e8a55",
    "level": "2",
    "content": "變電操作",
    "status": "1",
    "createdAt": null,
    "updatedAt": null,
    "parentContent": "變電"
  },
  {
    "id": "2213bf81-1f4f-4a8b-8900-c894d4afd890",
    "super_id": "1113bf81-1f4f-4a8b-8900-c894d4afd890",
    "level": "3",
    "content": "帶電斷、接引線",
    "status": "1",
    "createdAt": null,
    "updatedAt": null,
    "parentContent": "配電帶電作業"
  },
  {
    "id": "3313bf81-1f4f-4a8b-8900-c894d4afd890",
    "super_id": "2213bf81-1f4f-4a8b-8900-c894d4afd890",
    "level": "4",
    "content": "絕緣斗臂車被其它車輛碰撞;過往行人進入作業現場;高空落物傷人。",
    "status": "1",
    "createdAt": null,
    "updatedAt": null,
    "parentContent": "帶電斷、接引線"
  }
];

 

//data的格式是直接從mysql里select出來的 數據結構為:
// CREATE TABLE `t_risk_point` (
//   `id` varchar(64) NOT NULL,
//   `super_id` varchar(64) DEFAULT NULL,
//   `level` varchar(64) DEFAULT NULL,
//   `content` varchar(64) DEFAULT NULL,
//   `status` varchar(64) DEFAULT NULL,
//   `createdAt` datetime DEFAULT NULL,
//   `updatedAt` datetime DEFAULT NULL,
//   PRIMARY KEY (`id`)
// ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


getRiskJson(data,function(data){

 console.log("Print Tree :"+JSON.stringify(data));
});

 

遞歸好以后:

{
  "0013bf81-1f4f-4a8b-8900-c894d4afd890": {
    "id": "0013bf81-1f4f-4a8b-8900-c894d4afd890",
    "super_id": null,
    "level": "1",
    "content": "配電",
    "status": "1",
    "createdAt": null,
    "updatedAt": null,
    "parentContent": null,
    "sub": {
      "1113bf81-1f4f-4a8b-8900-c894d4afd890": {
        "id": "1113bf81-1f4f-4a8b-8900-c894d4afd890",
        "super_id": "0013bf81-1f4f-4a8b-8900-c894d4afd890",
        "level": "2",
        "content": "配電帶電作業",
        "status": "1",
        "createdAt": null,
        "updatedAt": null,
        "parentContent": "配電",
        "sub": {
          "2213bf81-1f4f-4a8b-8900-c894d4afd890": {
            "id": "2213bf81-1f4f-4a8b-8900-c894d4afd890",
            "super_id": "1113bf81-1f4f-4a8b-8900-c894d4afd890",
            "level": "3",
            "content": "帶電斷、接引線",
            "status": "1",
            "createdAt": null,
            "updatedAt": null,
            "parentContent": "配電帶電作業",
            "sub": {
              "1111181-1f4f-4a8b-8900-c894d4afd890": {
                "id": "1111181-1f4f-4a8b-8900-c894d4afd890",
                "super_id": "2213bf81-1f4f-4a8b-8900-c894d4afd890",
                "level": "4",
                "content": "過往行人進入作業現場",
                "status": "1",
                "createdAt": "2017-03-08T07:42:20.000Z",
                "updatedAt": "2017-03-25T07:42:24.000Z",
                "parentContent": "帶電斷、接引線",
                "sub": {
                 
                }
              },
              "3313bf81-1f4f-4a8b-8900-c894d4afd890": {
                "id": "3313bf81-1f4f-4a8b-8900-c894d4afd890",
                "super_id": "2213bf81-1f4f-4a8b-8900-c894d4afd890",
                "level": "4",
                "content": "絕緣斗臂車被其它車輛碰撞;過往行人進入作業現場;高空落物傷人。",
                "status": "1",
                "createdAt": null,
                "updatedAt": null,
                "parentContent": "帶電斷、接引線",
                "sub": {
                 
                }
              }
            }
          }
        }
      }
    }
  },
  "00b0bd76-a9be-4f1e-94ea-6847090e8a55": {
    "id": "00b0bd76-a9be-4f1e-94ea-6847090e8a55",
    "super_id": null,
    "level": "1",
    "content": "變電",
    "status": "1",
    "createdAt": null,
    "updatedAt": null,
    "parentContent": null,
    "sub": {
      "11b0bd76-a9be-4f1e-94ea-6847090e8a55": {
        "id": "11b0bd76-a9be-4f1e-94ea-6847090e8a55",
        "super_id": "00b0bd76-a9be-4f1e-94ea-6847090e8a55",
        "level": "2",
        "content": "變電操作",
        "status": "1",
        "createdAt": null,
        "updatedAt": null,
        "parentContent": "變電",
        "sub": {
         
        }
      }
    }
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM