构建树形结构方法一

function builderData(data, parentId) {
  let mapData = new Map();
  mapData.set(parentId, {});
  data.forEach(item => {
    mapData.set(item.id, item);
  });
  mapData.forEach((value, key) => {
    let pId = value.parentId;
    if (key != parentId) {
      mapData.get(pId).children = mapData.get(pId).children || [];
      mapData.get(pId).children.push(value);
    }else{
      mapData.get(key).children = []
    }
  });
  return mapData.get(parentId).children
}

构建树形结构方法二

function builderData(data, parentId) {
  let arr = [];
  data.forEach(item => {
    if(item.parentId == parentId){
      let children = builderData(data, item.id);
      item.children = children
      arr.push(item)
    }
  })
  return arr
}

拆分树形结构

function separateData(data) {
  let arr = [];
  data.forEach(item=>{
    if(item.children.length > 0){
      arr = arr.concat(separateData(item.children))
      arr.push(item)
    }else{
      arr.push(item)
    }
  })
  return arr
}