1. /**
    2. * 树组件节点添加属性
    3. * @param {Object} data 树的源数据
    4. * @returns {Object} data 添加自定义属性后的树的数据
    5. */
    6. setTreeRecursion(data) {
    7. data.map((item,index) => {
    8. item.scopedSlots = { title: 'customNode'};
    9. if(item.children.length != 0){
    10. this.setTreeRecursion(item.children);
    11. }
    12. });
    13. return data;
    14. }
    15. setTreeRecursion('树结构数据')
    1. /**
    2. * 查询 树组件 共有多少节点
    3. * @param {Object} data 树的源数据
    4. * @returns {Number} num 总节点数
    5. */
    6. queryNodesTotal(data, num = 0){
    7. let forFn = (nodes) => {
    8. for(let i = 0; i < nodes.length; i++){
    9. num++;
    10. if(nodes[i].children){
    11. forFn(nodes[i].children);
    12. }
    13. }
    14. }
    15. forFn(data);
    16. return num;
    17. }
    18. queryNodesTotal('树结构数据')
    1. /**
    2. * 取出树组件最后子节点---一维数组
    3. * @param {Object} node 树的源数据
    4. * @returns {Object} temp 取出树组件最后子节点的集合
    5. */
    6. getLastChildNode(node, temp = []) {
    7. let forFn = (arr) => {
    8. for (let i = 0; i < arr.length; i++) {
    9. if (arr[i].children.length === 0) {
    10. temp.push(arr[i]);
    11. } else {
    12. forFn(arr[i].children)
    13. // if(arr[i].children.length != 0){
    14. // forFn(arr[i].children)
    15. // }
    16. }
    17. }
    18. }
    19. forFn(node)
    20. return temp;
    21. }
    22. getLastChildNode('树结构数据')
    1. /**
    2. * 取出树组件最后子节点---二维数组
    3. * @param {Object} node 树的源数据
    4. * @returns {Object} temp 取出树组件最后子节点的集合
    5. */
    6. getLastChildNode(node, temp = []) {
    7. let forFn = (arr) => {
    8. for (let i = 0; i < arr.length; i++) {
    9. if (arr[i].children.length === 0) {
    10. temp.push(arr);
    11. arr = [];
    12. } else {
    13. forFn(arr[i].children)
    14. }
    15. }
    16. }
    17. forFn(node)
    18. return temp;
    19. }
    20. getLastChildNode('树结构数据')
    1. /**
    2. * 删除树组件源数据的最后子节点
    3. * @param {Object} node 树的源数据
    4. * @returns {Object} node 删除最后子节点之后的树的数据
    5. */
    6. deleteSourceNode(node) {
    7. for (let i = node.length - 1; i >= 0; i--) {
    8. if (!node[i].hasOwnProperty('children')) {
    9. continue;
    10. }
    11. if (node[i].children.length === 0) {
    12. node.splice(i, 1);
    13. continue;
    14. }
    15. this.deleteSourceNode(node[i].children);
    16. }
    17. return node;
    18. }
    19. deleteSourceNode('树组件数据')
    1. /**
    2. * 查询 树组件 父节点
    3. * @param {Object} node 树的源数据
    4. * @param {Object} pid 节点的pid
    5. * @returns {Object} temp 返回的父节点数据
    6. */
    7. queryParentNode(node, pid, temp = undefined){
    8. let forFn = (arr, id) => {
    9. for (let i = 0; i < arr.length; i++) {
    10. if (arr[i].id === id) {
    11. temp = arr[i]; // 查询父级节点
    12. break;
    13. // 如需查询所有父节点: 参数 temp 的默认值设置为空数组('[]')
    14. // temp.push(arr[i]); // arr[i]应 push 到 temp 中
    15. // forFn(node, arr[i].pId); // 继续递归查询
    16. // break;
    17. } else {
    18. if (arr[i].children) {
    19. forFn(arr[i].children, id)
    20. }
    21. }
    22. }
    23. }
    24. forFn(node, pid);
    25. return temp;
    26. }
    27. queryParentNode('树组件数据', '节点的pId')
    1. /**
    2. * 树形数据(数组)获取最深层级数
    3. * @param {Object} treeData 树的源数据
    4. * @returns {Number} max 最深层级数的值
    5. */
    6. getMaxFloor(treeData) {
    7. let floor = 0;
    8. let max = 0;
    9. let deepEach = (data, floor) => {
    10. data.map((item,index) => {
    11. item.floor = floor;
    12. if (floor > max) {
    13. max = floor;
    14. };
    15. if (item.children.length > 0) {
    16. deepEach(item.children, floor + 1);
    17. };
    18. });
    19. };
    20. deepEach(treeData, 1);
    21. return max;
    22. }
    23. getMaxFloor('树组件数据')
    1. /**
    2. * 将树结构数据格式,转化为,二维数组 表格形式
    3. * @param {Object} node 树的源数据
    4. * @returns {Object} data 树转化为二维数组的数据
    5. */
    6. parseTreeToRow(node, data = [], row = []) {
    7. if (node.children.length === 0) {
    8. data.push(row);
    9. } else {
    10. node.children.map((item,index) => {
    11. const obj = {
    12. label:item.label,
    13. id: item.id,
    14. isfile: item.isfile,
    15. pId: item.pId
    16. };
    17. this.parseTreeToRow(item, data, [...row, obj]);
    18. });
    19. }
    20. return data;
    21. }
    22. // 需要一个 只有一个根节点 的数据
    23. let obj = {
    24. id: '',
    25. isfile: false,
    26. label: '',
    27. pId: '',
    28. children: '树组件数据'
    29. }
    30. parseTreeToRow(obj)
    1. /**
    2. * 查询树组件的所有父节点
    3. * @param {Object} treeData 树的源数据
    4. * @returns {Object} id 节点的id
    5. */
    6. findParents(treeData,id) {
    7. let allparents = []
    8. if(treeData.length === 0){
    9. return
    10. }
    11. let findele = (data,id) => {
    12. if (!id) return
    13. data.forEach((item,index) => {
    14. if (item.id === id) {
    15. allparents.unshift(item.id)
    16. findele(treeData,item.parentId)
    17. } else {
    18. if (item.children) {
    19. findele(item.children,id)
    20. }
    21. }
    22. })
    23. }
    24. findele(treeData,id)
    25. return allparents
    26. }
    1. /**
    2. * 递归组装树数据
    3. * @param {*} arr
    4. * @param {*} pid
    5. * @returns 组装好的树结构
    6. */
    7. function createTree(arr, pid = 0) {
    8. return arr
    9. .filter((v) => v.parent_id === pid)
    10. .map((v) => {
    11. v = JSON.parse(JSON.stringify(v))
    12. const children = createTree(arr, v.id)
    13. if (children.length) {
    14. v.children = createTree(arr, v.id)
    15. }
    16. return v
    17. })
    18. }