美文网首页
图图算法

图图算法

作者: 键盘上敲音符 | 来源:发表于2021-12-04 16:52 被阅读0次

数组聚合

需求

当我们有一个一维数组,我们希望把它按照某个类型聚合成二维数组;形如下面。

       // 原数组
        let arr = [{
                title: '一 1测试',
                id: 1
            },
            {
                title: '一 2测试',
                id: 1
            },
            {
                title: '一 3测试',
                id: 1
            },
            {
                title: '一 4测试',
                id: 1
            },
            {
                title: '二 1测试',
                id: 2
            },

        ]
        // 算法后的数组
        let newArr = [{
                "title": "一",
                "children": [{
                        "title": "一 1测试",
                        "id": 1
                    },
                    {
                        "title": "一 2测试",
                        "id": 1
                    },
                    {
                        "title": "一 3测试",
                        "id": 1
                    },
                    {
                        "title": "一 4测试",
                        "id": 1
                    }
                ]
            },
            {
                "title": "二",
                "children": [{
                    "title": "二 1测试",
                    "id": 2
                }]
            }
        ]

解答

方法一

      let map = {},
      dest = [];
    arr.forEach((item) => {
      // 不存在这个key,给dest 数组创建了一个项,并携带子集,并给map 创建了一项
      if (!map[item.id]) {
        dest.push({
          title: item.title,
          id: item.id,
          children: [item],
        });
        // 这个id已被标记
        map[item.id] = 'flag';
      }
      // 存在这个key,代表dest 已经有了这个值了,并且
      else {
        for (let j = 0; j < dest.length; j++) {
          let dj = dest[j];
          // 这个判断很重要,当前项已经在dest数组存在,所以要循环dest数组,找到匹配项,然后不找了
          if (item.id == dj.id) {
            dj.children.push(item);
            break;
          }
        }
      }
    });

方法二

let map = {},
      dest = [];
    arr.forEach((item) => {
      // 不存在这个key,给dest 数组创建了一个项,并携带子集,并给map 创建了一项
      if (!map[item.id]) {
        dest.push({
          title: item.title,
          id: item.id,
          children: [item],
        });
        // 这个id已被标记
        map[item.id] = 'flag';
      }
      // 存在这个key,代表dest 已经有了这个值了,并且
      else {
        let dj = dest.find(j => j.id == item.id)
        dj.children.push(item)
      }
    });
    console.log(dest);

思考:巧妙的地方在于利用对象只有唯一的key,来建立类型;一开始循环的时候,肯定没有任何类型,那么就创建一个类型,并且把这条数据放到新的数组中。第二次循环的时候,遇到了这个类型。那么去循环新的数组。通过类型比较,找到这个类型,然后在此类型的子集下添加当前项,跳出循环

递归

曾多次能看到敞开大门乘客们的科目曾多次

相关文章

  • 图图算法

    数组聚合 需求 当我们有一个一维数组,我们希望把它按照某个类型聚合成二维数组;形如下面。 解答 思考:巧妙的地方在...

  • 有向图和最短路径Dijkstra、Bellman-Ford、Fl

    本篇开始讨论关于有向图的算法,无向图是特殊的有向图。内容概要: 有向图的实现 最短路径经典算法实现 有向图的实现 ...

  • java最短路径(jgrapht)

    基于jgrapht求最短路径的算法,有向图/无向图,加权图

  • 图算法

    1. 图 1.1. 概念 顶 顶点的度 d 边 相邻 重边 环 完全图: 所有顶都相邻 二分图: , X中, Y ...

  • 算法图

    0.2 算法复杂度 1.堆排序2.冒泡排序3.选择排序 推荐文章:https://www.cnblogs.com/...

  • 算法 - 图

    图 图是网络结构的抽象模型,是一组由边连接的节点 图可以表示任何二元关系,比如道路、航班 JS中没有图,但是可以用...

  • 史上最清晰的 Tarjan 算法详解

    摘要:图的算法是进行静态分析的基础数据算法,如何提高图的分析效率,就需要对图的算法有进一步的认识。 1.引言 在静...

  • 头条-手撕代码

    [toc] 图算法 以及最短路径算法 树算法 手写LRU 排序算法 链表算法

  • 经典图割算法中图的构建及实现之graph-cut

    经典图割算法中图的构建及实现之graph-cut 本文目的: 讲解目前典型的3种图割算法:graph-cut、gr...

  • 最短路径

    图的两种搜索算法,深度优先搜素和广度优先搜索。这两种算法主要是针对无权图的搜索算法。针对有权图,也就是图中的每条边...

网友评论

      本文标题:图图算法

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