树形结构数据中提取每一个叶子节点的完整父子关系数据

一个典型的树形结构数据,比如element-tree:

const JSONData = [
      {
        id: 1001,
        label: "一级目录1",
        show: true,
        children: [
          {
            id: 1008,
            label: "新目录1-1",
            show: true,
            children: [
              {
                id: 1009,
                label: "新目录1-1-1",
                show: true,
                children: [],
              },
            ],
          },
        ],
      },
      {
        id: 1002,
        label: "一级目录2",
        show: true,
        children: [
          {
            id: 1016,
            label: "新目录2-1",
            show: true,
            children: [
              {
                id: 1016,
                label: "新目录2-1-1",
                show: true,
                children: [],
              },
            ],
          },
          {
            id: 1017,
            label: "新目录2-2",
            show: true,
            children: [],
          },
        ],
      },
      {
        id: 1003,
        label: "一级目录3",
        show: true,
        children: [],
      },
      {
        id: 1004,
        label: "一级目录4",
        show: true,
        children: [],
      },
      {
        id: 1005,
        label: "一级目录5",
        show: true,
        children: [],
      },
      {
        id: 1006,
        label: "一级目录6",
        show: true,
        children: [],
      },
      {
        id: 1007,
        label: "一级目录7",
        show: true,
        children: [],
      },
      {
        id: 1008,
        label: "一级目录8",
        show: true,
        children: [],
      },
      {
        id: 1011,
        label: "一级目录9",
        show: true,
        children: [],
      },
      {
        id: 1012,
        label: "一级目录10",
        show: true,
        children: [],
      },
    ];

递归:

function getDirLevelArr(JSONData) {
      // 叶子节点数组
      const leafDirArr = [];

      // 获取所有叶子节点
      function getLeafDirArr(_JSONData) {
        for (let i = 0; i < _JSONData.length; i++) {
          if (_JSONData[i].children.length === 0) {
            leafDirArr.push(_JSONData[i].label);
          } else {
            getLeafDirArr(_JSONData[i].children);
          }
        }
      }

      getLeafDirArr(JSONData);

      // 检测是否有重复值
      const initArr = [];
      for(let i = 0; i < leafDirArr.length; i++){
        if(initArr.indexOf(leafDirArr[i]) < 0){
          initArr.push(leafDirArr[i]);
        }else{
          alert(`"${leafDirArr[i]}"名称已经重复,请确保所有文件夹中只有一个"${leafDirArr[i]}"。`);
          return false;
        }
      }   

      const targetData = {};

      function loops(data = [], parent) {
        return data.map(({ children, label: value }) => {
          const node = {
            value,
            parent,
          };
          targetData[value] = node;
          node.children = loops(children, node);
          return;
        });
      }

      function getNode(value) {
        let node = [];
        let currentNode = targetData[value];
        node.push(currentNode.value);
        if (currentNode.parent) {
          node = [...getNode(currentNode.parent.value), ...node];
        }
        return node;
      }

      loops(JSONData);

      const singalDirLevelArr = [];
      const multiDirLevelArr = [];

      for (let i = 0; i < leafDirArr.length; i++) {
        const target = getNode(leafDirArr[i]);
        if (target.length > 1) {
          multiDirLevelArr.push(target.join("/"));
        } else {
          singalDirLevelArr.push(target.join("/"));
        }
      }

      return {
        singalDirLevelArr,
        multiDirLevelArr
      }
    }

查看结果:

console.log(getDirLevelArr(JSONData))

注意:每一个节点的名称不能相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值