根据parentid(parent_id)拼树结构(js)

7,224 阅读2分钟

树形结构,根据parentid(parent_id)父子ID生成树形节点

某次遇一项目需求,根据parent_id生成树结构,分两种情况,第一种是有一个总的parent_id为0的情况,树顶级节点就是parent_id为0的节点;还有一种情况就是平级,没有总的parent_id为0的情况; 度娘了很多,没发现类似的,只能自己写个递归方法,具体数据如下:

第一种数据:

[

      {id: "27970285570", name: "IT", parent_id: "0"},
      {id: "27697655810", name: "IT-IT3", parent_id: "27970285570"},
      {id: "27794124801", name: "IT-IT4", parent_id: "27970285570"},
      {id: "27815096322", name: "IT-IT2", parent_id: "27970285570"},
      {id: "27928342530", name: "IT-IT1", parent_id: "27970285570"},
      {id: "27936731137", name: "IT-IT5", parent_id: "27970285570"},
      {id: "27987062786", name: "IT-IT6", parent_id: "27970285570"},
      {id: "27634741251", name: "IT-IT2-1", parent_id: "27815096322"},
      {id: "27932536834", name: "IT-IT2-2", parent_id: "27815096322"}

]

需要组合成如下格式:

第二种数据:

[

{id: "12345678905456",name: "IT-IT2-1",parent_id: "2256455"},
{id: "12345678901459",name: "IT-IT2-1-A",parent_id: "12345678905456"},
{id: "12345678905454",name: "IT-IT2-2",parent_id: "2256452"},
{id: "12345678905453",name: "IT-IT2-3",parent_id: "2256451"}

]

需要组合成如下格式:

递归方法附上:

function getTrees(list, parent_id = 0) {
  let parentObj = {};
  list.forEach(o => {
    parentObj[o.id] = o;
  })
  if(!parent_id){
    return list.filter(o => !parentObj[o.parent_id]).map(o => (o.children = getTrees(list, o.id), o));
  }else{
    return list.filter(o => o.parent_id == parent_id).map(o => (o.children = getTrees(list, o.id), o));
  }
};

一个递归方法即可解决parentid拼树结构。