JS实现数组转换成树形结构数组(封装公共方法)

我们每次编写一个方法都要考虑是否可以公用,看是否所有的数据结构都能适用这方法

1.比如我们此时的数据结构如下

      let list = [
        {
          label: "B2B",
          parentId: "0",
          value: "CH03",
        },
        {
          label: "智能家居",
          parentId: "CH03",
          value: "CH03002",
        },
        {
          label: "地产代理",
          parentId: "CH03002",
          value: "CH03002002",
        },
        {
          label: "公寓代理",
          parentId: "CH03002",
          value: "CH03002002",
        },
        {
          label: "区域连锁",
          parentId: null,
          value: "CH07",
        },
        {
          label: "区域连锁",
          parentId: "CH07",
          value: "CH07001",
        },
        {
          label: "分支",
          parentId: "CH07001",
          value: "CH07001002",
        },
        {
          label: "分支2",
          parentId: "CH07001",
          value: "CH07001002",
        },
      ];
  1. 公共方法编写如下

  • * @param {*} array 传入的数组

  • * @param {*} getParentId 传入一个函数 获取父亲的ID 唯一标识

  • * @param {*} key 父亲的唯一标识

  • * @param {*} childKey 默认child名字数组

      /**
       *
       * @param {*} array  传入的数组
       * @param {*} getParentId 传入一个函数 获取父亲的ID 唯一标识
       * @param {*} key 父亲的唯一标识
       * @param {*} childKey 默认child名字数组
       * @returns
       */
      function trees(array, getParentId, key = "id", childKey = "child") {
        const pool = [...array].reverse(); //浅拷贝在翻转
        const trees = [];
        const rootMap = {};
        const nodeMap = {};
        let count = 0;
        let item;
        for (let i = 0; i < array.length; i++) {
          nodeMap[array[i][key]] = array[i]; //这里可以理解为浅拷贝,共享引用
        }

        while ((item = pool.pop())) {
          const parentId = getParentId(item); //找到pool中每一项item的父亲ID

          if (!parentId || !nodeMap[parentId]) {
            trees.push(item);
            rootMap[item[key]] = item;
          } else {
            if (rootMap[parentId]) {
              //说明元素有父亲,把元素放在父亲的childKey下面
              rootMap[parentId][childKey] = rootMap[parentId][childKey] || [];
              rootMap[parentId][childKey].push(item);
              rootMap[item[key]] = item;
            } else {
              //说明元素没有父亲,是根节点,向数组的开头添加一个
              pool.unshift(item);
            }
          }
        }
        return trees;
      }
  1. 使用如下

      const getParentId = (item) => item.parentId; //写一个函数获取对应的父亲ID
      let testList = trees(list, getParentId, "value");
      console.log("testList", testList);

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值