【Jvascript 算法】-- JavaScript实现对树结构数据的增删以及树型数据与数组的相互转换

在日常开发中我们经常会碰到树结构数据,以下是我的笔记:

const arr =[
    {id:2,name:'部门B',parentId:0},
    {id:3,name:'部门C',parentId:1},
    {id:1,name:'部门A',parentId:2},
    {id:4,name:'部门D',parentId:1},
    {id:5,name:'部门E',parentId:2},
    {id:6,name:'部门F',parentId:3},
    {id:7,name:'部门G',parentId:2},
    {id:8,name:'部门H',parentId:4}
];

一维数组转树结构:

function toTree (data, pId) {
  const loop = parentId => {
    const res = []
    data.forEach(item => {
      if (item.parentId === parentId) {
        item.children = loop(item.id)
        res.push(item)
      }
    })
    return res
  }
  return loop(pId)
}

树结构转一维数组:

function treeToArr(data) {
  const result = [];
  data.forEach(item => {
      const loop = data => {
          result.push({
            id: data.id,
            name: data.name,
            parentId: data.parentId
          });
          let child = data.children
          if(child){
            for(let i = 0; i < child.length; i++){
              loop(child[i])
            }
          }
      }
      loop(item);
  })
  return result;
}

遍历树结构:

function readTree(data) {
  data.forEach(item => {
    const loop = data => {
        let child = data.children
        if(child){
          for(let i = 0; i < child.length; i++){
            loop(child[i])
          }
        }
        console.log(data);
        // 可以在这里做一些遍历的操作
    }
    loop(item);
  })
}

删除树节点:

function deleteTree(tree, deleteId) {
  let treeData = JSON.parse(JSON.stringify(tree));
  const deleteParentNode = data => {
    const ret = [];
    for (let i = 0, l = data.length; i < l; i++) {
      const node = data[i];
      if (node.id !== deleteId) {
        ret.push(node);
      }
      if (!!node.children) {
        node.children = deleteParentNode(node.children);
      }
    }
    return ret;
  };
  return deleteParentNode(treeData);
}

增加节点:

function addTree(tree, parentId, addNodeData) {
  // parentId 父节点id
  let treeData = JSON.parse(JSON.stringify(tree));
  const addNode = data => {
    const ret = [];
    for (let i = 0, l = data.length; i < l; i++) {
      const node = data[i];
      ret.push(node);
      if (!!node.children) {
        if (node.id === parentId) {
          node.children = addNode([...node.children, ...addNodeData]);
        } else {
          node.children = addNode(node.children);
        }
      }
    }
    return ret;
  };
  return addNode(tree);
}

你可能感兴趣的:(【Jvascript 算法】-- JavaScript实现对树结构数据的增删以及树型数据与数组的相互转换)