json数据生成树

形成树,此方法有局限性,id和parentId 都是顺序添加的

var data = [
  {id:1,name:'json',parentId:0},
  {id:2,name:'json',parentId:0},
  {id:3,name:'json',parentId:1},
  {id:4,name:'json',parentId:2},
  {id:5,name:'json',parentId:3},
  {id:6,name:'json',parentId:4},
  {id:7,name:'json',parentId:5},
  {id:8,name:'json',parentId:5},
  {id:9,name:'json',parentId:8},
  {id:10,name:'json',parentId:2},
]

var buildTree = (data) => {
  data.sort((a, b) => a.parentId - b.parentId)
  while(data[data.length - 1].parentId > 0){
    let cur = data.pop()
    let parent = data.filter((node)=>{
      return node.id == cur.parentId
    })
    if(parent.length == 1){
      if(typeof(parent[0].children) == 'object'){
        parent[0].children.push(cur)
      }else{
        parent[0].children = []
        parent[0].children.push(cur)
      }      
    }
  }
  return data
}

 改进思路:按层排列结点,然后从叶子到根链接树

var buildTree = (data) => {
  let n = data.length
  let level = []
  level.push(...data.filter((val)=>val.parentId == 0))
  for(let i = 0;i<n;i++){
    let children = data.filter((val)=>val.parentId ==  level[i].id)
    for(let child of children){
      level.push(child)
    }
  }
  while(level[level.length - 1].parentId > 0){
    let cur = level.pop()
    let parent = level.filter((node)=>{
      return node.id == cur.parentId
    })
    if(parent.length == 1){
      if(typeof(parent[0].children) == 'object'){
        parent[0].children.push(cur)
      }else{
        parent[0].children = []
        parent[0].children.push(cur)
      }      
    }
  }
  return level
}

 

posted @ 2021-08-10 18:36  尖子  阅读(256)  评论(0编辑  收藏  举报