TreeData 树结构数据类

2020/12/28

创建一个管理树结构数据的实例,针对这棵树提供很多操作方法。

# 例子

import { TreeData } from '@liz-q/utils'

const tree = [{
  id: 1,
  label: '一级 1',
  children: [{
    id: 4,
    label: '二级 1-1',
    children: [{
      id: 9,
      label: '三级 1-1-1'
    }, {
      id: 10,
      label: '三级 1-1-2'
    }]
  }]
}]

const treeData = new TreeData(tree, {
    key: 'id',
    children: 'children'
})

# 实例化参数

  1. tree (Array) :树结构数据
  2. treeProps(Object) :配置参数
  3. treeProps.key (String) : 指定唯一项 key 字段名,默认是 id
  4. treeProps.children (String) :指定子树字段名,默认 children
  5. treeProps.isLeaf (String) :指定是否是叶子节点字段名,默认是 isLeaf

# 实例方法

  1. getNode (id)=>node :获取节点
  2. cloneDeepTree ()=>tree: 深拷贝一棵树
  3. traverseTree (cb: (node, parentNode, index)=>void, condition: (node) => boolean)=>void :遍历树,满足 condition 条件的节点执行 cb 函数
  4. filterTree (condition: (node) => boolean, newTree: boolean) => tree :过滤树,condition 是条件函数,newTree 标识是否返回一颗新树,当为 true 时,不改变原树,当为 false 时,原树可能会被改变,不传默认为 true
  5. getLeafs () => node[] : 获取叶子节点
  6. getSubTreeByLevel (level: number) => tree :获取 1 到 level 级子树
  7. getTreeLevel (id) => {max: number, targetLevel: number} :获取树的最大层级,以及目标节点所在层级
  8. addChild (parentId, child) => void : 添加子节点
  9. removeChild (parentId) => void : 删除所有子节点

# 类静态方法

type FunctionVoid = (...args: any[]) => void
type FunctionBoolean = (...args: any[]) => boolean

interface ObjectAny {
	[key:string]: any
}

interface TreePropsType {
    key?: string;
    children?: string;
    isLeaf?: string;
}
interface FlatListPropsType {
    key: string;
    parentKey: string;
}
type TreeDataItemType = ObjectAny;
type TreeDataType = Array<TreeDataItemType>;

class BaseTree {
    /**
     * @function 获取指定节点
     * @param nodes {array} 树数据
     * @param val {any} key字段对应的值
     * @param _props
     * */
    static _getNode(nodes: TreeDataType | undefined, val: any, _props: TreePropsType): ObjectAny | undefined;
    /**
     * @function 遍历树,满足条件的节点将会执行回调函数
     * @param nodes {array} 树数据
     * @param cb {(node, parentNode, index) => {}} 回调函数
     * @param condition {(node) => boolean} 条件函数
     * @param _props
     * */
    static _traverseTree(nodes: TreeDataType | undefined, cb: FunctionVoid, condition: FunctionBoolean | undefined, _props: TreePropsType): void;
    /**
     * @function 过滤树
     * @param nodes {array} 树数据
     * @param condition {(node)=>boolean} 条件函数
     * @param _props
     * */
    static _getFilterTree(nodes: TreeDataType | undefined, condition: FunctionBoolean, _props: TreePropsType): ObjectAny[];
    /**
     * @function 获取所有叶子节点组成的数组
     * @param nodes {array} 树数据
     * @param _props
     * */
    static _getLeafs(nodes: TreeDataType | undefined, _props: TreePropsType): ObjectAny[];
    /**
     * @function 获取固定层级以上的子树
     * @param nodes {array} 树数据,最好深拷贝一棵树,避免改变原树
     * @param level {number} 限制层级
     * */
    static _getSubTreeByLevel(nodes: TreeDataType | undefined, level: number, _props: TreePropsType): TreeDataType;
    /**
     * @function 获取树的最大层级,以及目标节点所在层级
     * @param nodes {array} 树结构
     * @param val {any} 目标节点key对应的值
     * */
    static _getTreeLevel(nodes: TreeDataType | undefined, val: any, _props: TreePropsType): {
        max: number;
        targetLevel: number;
    };
    /**
     * @function 将树结构拉平,自动填充id和pid,id的值取_props中key对应的值,pid指父节点id
     * @param nodes
     * @param _props
     * */
    static _getFlatTree(nodes?: TreeDataType, _props?: TreePropsType): object[];
    /**
     * @function 将一维树数据转换成标准树结构
     * @param flatList 一维树数据
     * @param _props 配置信息,指定 key 字段和 parentKey 字段
     * */
    static _getTreeFromFlat(flatList?: TreeDataType, _props?: FlatListPropsType): any[];
    /**
     * @function 刪除节点
     * @param node {object, string, number} 数据对象或主键值
     * @param nodes {array} 树数据
     * @param _props {TreePropsType}
     * */
    static _deleteNode(node: TreeDataItemType | string | number, nodes?: TreeDataType, _props?: TreePropsType): void;
    /**
     * @function 提供一个方法,获取节点所在数组的索引和所在数组
     * @param nodes {array} 树数据
     * @param val {any} key字段对应的值
     * @param _props
     * */
    static _getNodeInfo(nodes: TreeDataType | undefined, val: any, _props: TreePropsType): ObjectAny | undefined;
    tree: TreeDataType;
    treeProps: TreePropsType;
    constructor(tree: TreeDataType, treeProps?: TreePropsType);
}

Last Updated: 2024/1/11 下午4:35:28