扁平数组与树形相互转化

128 阅读1分钟

原文章 加上了注释

扁平转树形

function convert(list){
    const res=[ ]
    //相当于map字典,用来查找
      const obj=list.reduce((pre,cur)=>{
        pre[cur.id]=cur
        return pre
      },{})
    for(let item of list){
      //根节点直接放结果数组
      if(item.parent_id===0){
        res.push(item)
        continue
      //否则就在字典里寻找父节点
      }else{
           let parent=obj[item.parent_id]
           //直接往父节点上加孩子,如果已经加过孩子就直接push进去,因为是引用类型,所以obj修改res直接被修改
           parent.children=parent.children||[]
           parent.children.push(item)
         }
    }
    return res
  }
  console.log(convert(flatArr))

树形转扁平

 function flatten(arr){
    return arr.reduce((pre,cur)=>{
      let {children=[],...item}=cur
      return pre.concat( [{...item}],flatten(children))
    },[])
  }