树结构转换

203 阅读1分钟
// json转树
    json_tree(data, id, pid) {
      let result = [], temp = {};
      for (let i = 0; i < data.length; i++) {
        temp[data[i][id]] = data[i]; // 以id作为索引存储元素,可以无需遍历直接定位元素
      }
      for (let j = 0; j < data.length; j++) {
        let currentElement = data[j];
        let tempCurrentElementParent = temp[currentElement[pid]]; // 临时变量里面的当前元素的父元素
        if (tempCurrentElementParent) {
          // 如果存在父元素
          if (!tempCurrentElementParent["children"]) {
            // 如果父元素没有chindren键
            tempCurrentElementParent["children"] = []; // 设上父元素的children键
          }
          tempCurrentElementParent["children"].push(currentElement); // 给父元素加上当前元素作为子元素
        } else {
          // 不存在父元素,意味着当前元素是一级元素
          result.push(currentElement);
        }
      }
      return result;
    },
// 文本转成树
    trans_tree(data) {
      let result = [];
      let findChidren = function (parent) {
        let stack = [...result];
        while (stack.length > 0) {
          let item = stack.shift();
          if (item.OptName == parent) { return item.children; } else if (item.children.length) { stack.push(...item.children); }
        }
      };
      for (let str of data) {
        let parent = null;
        let parentId = null;
        let _arr = str.split('/');
        _arr.forEach((temp, i) => {
          if (i == 0) {
            let Id = new Date().getTime();
            parentId = Id;
            let index = result.findIndex(({ OptName }) => OptName == temp);
            if (index == -1) { result.push({ OptName: temp, ParentId: 0, Id: Id, children: [] }); }
          } else {
            let children = findChidren(parent);
            let _index = children.findIndex(({ OptName }) => { return OptName == temp; });
            if (_index == -1) {
              let Id = this.commonApi.customNanoid();
              if (i != (_arr.length - 1)) {
                children.push({ OptName: temp, Id: Id, ParentId: children[0] && children[0].ParentId || parentId, children: [] });
                parentId = Id;
              } else {
                children.push({ OptName: temp, Id: Id, ParentId: children[0] && children[0].ParentId || parentId });
              }
            }
          }
          parent = temp;
        });
      }
      return result;
    },
treeConvertToArr(tree) {
      let arrs = [];
      let result = [];
      arrs = arrs.concat(tree);
      while (arrs.length) {
        let first = arrs.shift();
        if (first.children) {
          arrs = arrs.concat(first.children);
          delete first["children"];
        }
        result.push(first);
      }
      return result;
    },