美文网首页
树形结构数据中实用的方法

树形结构数据中实用的方法

作者: 陈大事_code | 来源:发表于2021-02-20 10:06 被阅读0次

预设:树形结构数据树形为value、children、label

  1. 格式化树形数据
// 格式化树形数据
// 参数1:树形数据源
// 参数2:需要替换的属性对象(props的key为替换后的属性名,value为需要替换的属性名)
// 参数2示例: props = { value: 'value1', label: 'label1', children: 'children1' },
export const formateTreeData = (data, props = {}) => {
  const currentProps = { children: 'children', ...props };

  const options = JSON.parse(JSON.stringify(data));
  if (!Array.isArray(options)) return [];

  for (const item of options) {
    for (const prop in currentProps) {
      if (prop === 'children') {
        if (Array.isArray(item[currentProps[prop]]) && item[currentProps[prop]].length) {
          item[prop] = formateTreeData(item[currentProps[prop]], currentProps);
        }
      } else {
        item[prop] = item[currentProps[prop]];
        delete item[currentProps[prop]];
      }
    }
  }

  return options;
};
  1. 获取当前节点下所有子节点
// 获取当前节点下所有叶子节点
// 参数:当前节点的对象
const getAllLeafNodes = (data) => {
  let { children } = data;
  let arr = [];

  if (!children) {
    // 本身就是叶子节点
    return [data];
  }

  for (let item of children) {
    if (item.children && Array.isArray(item.children) && item.children.length) {
      arr.push(...getAllLeafNodes(item));
    } else {
      arr.push(item);
    }
  }
    
  return arr;
};
  1. 查找目标value在树中的对象
// 查找目标value,在树中的对象Obj
// 参数1:需要查找的value,可以是单个,也可以是数组,即查询多个,此时返回值也为数组
// 参数2:树形数据源
const findInTreeData = (ids, data) => {
  if (!Array.isArray(data)) return;

  // 判断是否为多选
  let isMultiple = Array.isArray(ids);

  // 目标对象(可能为string,可能为array)
  let goal = null;

  if (isMultiple) {
    goal = [];
    for (let id of ids) {
      let res = findInTreeData(id, data);
      if (res) {
        goal.push(res);
      }
    }
  } else {
    // 遍历树
    for (let item of data) {
      let { value, children } = item;
      if (value === ids) {
        goal = item;
        break;
      } else {
        if (children && Array.isArray(children) && children.length) {
          goal = findInTreeData(ids, children);
          if (goal) break;
        }
      }
    }
  }

  return goal;
};
  1. 根据主键获取从顶层父节点至该节点的路径(用到了上述方法3,请引入)
import { isObject } from "lodash";

// 参数1:查询目标的主键id
// 参数2:树形数据源
// 返回结果:从顶层节点 至 目标节点的路径节点数组。
const findPathByValue = (value, data) => {
  let arr = [];

  // findInTreeData为上述方法3
  let currentNode = findInTreeData(value, data);

  // 判断当前节点是否找到,找到则加入数组
  if (isObject(currentNode) && Object.keys(currentNode).length) {
    arr.unshift(currentNode);
  }

  // 判断当前节点是否有父节点,若有则继续递归查找父节点id所在node
  if (currentNode.parentId) {
    arr.unshift(...findPathByValue(currentNode.parentId, data));
  }

  return arr;
};

为了适用通用大部分情况,返回的是路径数组,可以根据实际情况进行处理。

例如:需要返回路径名称,可以通过arr.map(item => item.label),即可得到路径名称数组。

相关文章

网友评论

      本文标题:树形结构数据中实用的方法

      本文链接:https://www.haomeiwen.com/subject/lhjtfltx.html