美文网首页
扁平数组转tree数组

扁平数组转tree数组

作者: renxiaoyao09 | 来源:发表于2020-03-03 13:07 被阅读0次

1、首先生成扁平数组

    // 生成随机数
    let random = (min, max) => parseInt(Math.random() * (max - min + 1) + min);
    // 生成扁平数组的方法,length可以控制生成的长度
    let createArr = length => {
      let arr = [];
      for (let i = 0; i < length; i++) {
        // 向数组内随机位置插入数据(打乱数组),数据的pid也是随机的
        arr.splice(random(0, arr.length), 0, {
          id: i + 1,
          name: "我是第" + (i + 1) + "个",
          pid: random(0, i),
        });
      }
      return arr;
    };
    // 生成数组
    let arr = createArr(10000);
    // 检查生成的tree是否有遗漏
    let checkFn = arrs => {
      return JSON.stringify(arrs).match(/pid/gi).length;
    };

2、两种方法

1、递归写法,空间复杂度O(2^n)

    let toTree1 = (arrs, ids) => {
      let cutArr = [];
      let newArr = arrs.filter(i => {
        if (i.pid == ids) {
          return true;
        } else {
          cutArr.push(i);
          return false;
        }
      });
      newArr.map(i => {
        i.children = toTree1(cutArr, i.id);
      });
      return newArr;
    };
    console.time("递归方法总耗时");
    let res1 = toTree1(arr, 0);
    console.log("递归方法结果:", res1);
    console.timeEnd("递归方法总耗时");
    console.log("递归方法检查:", checkFn(res1, 0));

2、对象方法,空间复杂度O(n)(一次遍历,性能提升非常明显)

    let toTree2 = (arrs, ids) => {
      let newArr = [];
      let obj = {};
      for (let i = 0; i < arrs.length; i++) {
        let { id, pid } = arrs[i];
        if (!obj[id]) obj[id] = { children: [] };
        obj[id] = { ...arrs[i], children: obj[id].children };
        if (pid == ids) {
          newArr.push(obj[id]);
        } else {
          if (!obj[pid]) {
            obj[pid] = { children: [arrs[i]] };
          } else {
            obj[pid].children.push(arrs[i]);
          }
        }
      }
      return newArr;
    };
    console.time("对象方法总耗时");
    let res2 = toTree2(arr, 0);
    console.log("对象方法结果:", res2);
    console.timeEnd("对象方法总耗时");
    console.log("对象方法检查:", checkFn(res2, 0));

3、两种方法比较

当数组里有10000条数据的时候


微信图片_20220307203000.png

相关文章

  • 扁平数组转tree数组

    1、首先生成扁平数组 2、两种方法 1、递归写法,空间复杂度O(2^n) 2、对象方法,空间复杂度O(n)(一次遍...

  • 扁平数组转tree

    (function init() { let arr = [{ id: 1, ...

  • js数组扁平数据结构转tree

    记录一下日常学习,js数组扁平数据结构转tree 演示数据 1.map存储 唯一性 2.递归 输出

  • 创建树

    将扁平化的节点数组,变成一棵树,使用tree-with-arraynpm i tree-with-array 创建...

  • Array, Object扁平化

    1. 数组扁平化 数组扁平化就是将多维数组转化为一维数组: 1.1 toString + split 先将数组转化...

  • 5种方式实现数组扁平化

    5种方式实现数组扁平化 数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 实现 1. reduce 遍历数...

  • 【重学】数组扁平化,乱序

    目录:数组扁平化数组乱序reduce()的妙用git复习:rebase,cherry-pick (1)数组扁平化 ...

  • 数组扁平化

    数组扁平化的概念 数组扁平化是指将一个多维数组变为一维数组 [1, [2, 3, [4, 5]]] ------...

  • 『JavaScript专题』之数组扁平化

    JavaScript专题之数组扁平化 扁平化 数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何...

  • 5种方式实现数组扁平化

    数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 实现 1. reduce 遍历数组每一项,若值为数组则递...

网友评论

      本文标题:扁平数组转tree数组

      本文链接:https://www.haomeiwen.com/subject/umlclhtx.html