JavaScript 树型结构操作封装

101 阅读1分钟
class TreeInterface {
    constructor(tree) {
      this.treeMap = this.buildTreeMap(tree);
    }
  
    // 构建以节点ID为键的映射
    buildTreeMap(tree) {
      const treeMap = new Map();
  
      const buildMap = (node) => {
        treeMap.set(node.id, node);
  
        if (node.children && node.children.length > 0) {
          for (let i = 0; i < node.children.length; i++) {
            buildMap(node.children[i]);
          }
        }
      };
  
      for (let i = 0; i < tree.length; i++) {
        buildMap(tree[i]);
      }
  
      return treeMap;
    }
  
    // 给出ID,返回该ID对应的节点
    getItemById(id) {
      return this.treeMap.get(id) || null;
    }
  
    // 给出ID,修改该ID对应节点的值
    updateItemById(id, updatedItem) {
      if (this.treeMap.has(id)) {
        const node = this.treeMap.get(id);
        Object.assign(node, updatedItem);
        return true;
      }
      return false;
    }
  
    // 给出ID和新节点,添加节点到指定ID节点的子节点中
    addNodeById(id, newNode) {
      if (this.treeMap.has(id)) {
        const parentNode = this.treeMap.get(id);
        if (!parentNode.children) {
          parentNode.children = [];
        }
        parentNode.children.push(newNode);
        this.buildTreeMap(parentNode.children); // 重新构建树映射
        return true;
      }
      return false;
    }
  
    // 给出ID,删除该ID对应的节点及其子节点
    deleteItemById(id) {
      if (this.treeMap.has(id)) {
        const node = this.treeMap.get(id);
        if (node && node.parentId !== -1) {
          const parentNode = this.treeMap.get(node.parentId);
          if (parentNode && parentNode.children && Array.isArray(parentNode.children)) {
            const index = parentNode.children.findIndex((child) => child.id === id);
            if (index !== -1) {
              parentNode.children.splice(index, 1);
              this.treeMap.delete(id); // 从树映射中删除节点及其子节点
              return true;
            }
          }
        }
      }
      return false;
    }
  
    // 给树添加disabled属性,条件自定义
    addDisabledProperty(customCondition) {
      for (const node of this.treeMap.values()) {
        node.disabled = customCondition(node);
      }
    }
  }