给文章中的h标签生成目录结构(巧妙利用双向链表数据结构)

硅谷探秘者 1756 0 0

1.前言

例如在用富文本编辑器编辑文章的时候,会用到h标签来代表本段标题,那么h标签是有顺序的,例如:

h标签的顺序可能是这样的
h1
h1
h2
h3
h1
h3
h2
h4

那么目录结构就应该是

那么目录结构应该是
h2
h1
----h2
--------h3
h1
----h3
----h2
--------h4

2.案例如图:

本文就介绍如何使用js设计数据结构,巧妙利用双向链表实现将顺序的目录,转换成树状目录。

3.js代码

<script>
	/**
	*	链表节点信息
	**/
	function Node(data){
		this.data=data;
		this.next=null;
		this.prev=null;
	}
	/**
	*	双向链表数据结构
	**/
	function LinkedList(){
		this.head=null;
		this.tail=null;
		
		/**
		*	添加节点(添加的节点是尾节点)
		**/
		this.add=function(data){
			var node=new Node(data);
			if(this.head==null){
				this.head=this.tail=node;
			}else{
				node.prev=this.tail;
				this.tail.next=node;
				this.tail=node;
			}
		}
		
		/**
		*	删除目标节点
		**/
		this.delete=function(node){
			if(node==null){
				return null;
			}
			if(node==this.head&&node==this.tail){
				this.head=null;
				this.tail=null;
			}else if(node==this.head){
				this.head=this.head.next;
				this.head.prev=null;
			}else if(node==this.tail){
				this.tail=this.tail.prev;
				this.tail.next=null;
			}else{
				node.prev.next=node.next;
				node.next.prev=node.prev;
			}
			node.next=null;
			node.prev=null;
			return node;
		}
	}

	/**
	*	数据节点信息
	**/
	function createNode(name,level){
		return {
			name:name, //名称
			level:level, //标签级别
			child:new Array(), //标签子节点
		};
	}
	
	/**
	*	生成链表和树的组合结构
	**/
	function create(h,arr){
		while(h!=null){
			var li=new LinkedList();
			while(h.next!=null){
				if(h.next.data.level>h.data.level){
					li.add(arr.delete(h.next).data)
				}else {
					break;
				}
			}
			/**
			*	递归生成子树
			**/
			create(li.head,li);
			h.data.child=li;
			h=h.next;
		}
	}
	
	/**
	*	将组合结构中的链表结构转换为数组结构
	**/
	function toArray(arr){
		var a=new Array();
		var h=arr.head;
		while(h!=null){
			if(h.data.child!=null){
				h.data.child=toArray(h.data.child);
			}
			a.push(h.data);
			h=h.next;
		}
		return a;
	}
	
	/**
	*	模拟h标签
	**/
	var array=new LinkedList();
	array.add(createNode("h2",2));
	array.add(createNode("h3",3));
	array.add(createNode("h2",2));
	array.add(createNode("h1",1));
	array.add(createNode("h3",3));
	array.add(createNode("h2",2));
	array.add(createNode("h2",2));
	array.add(createNode("h3",3));
	array.add(createNode("h3",3));
	array.add(createNode("h4",4));
	
	create(array.head,array);//生成树结构
	
	var data=JSON.stringify(toArray(array));//转化json
	
	/**
	*	打印数据
	**/
	console.log(data)
	
</script>

本js只是模拟用顺序的h标签,生成树状的json数据结构,代码多处涉及递归算法

具体html+js+css实现请参考:http://jiajiajia.club/blog/artical/vSdf1Q/406


评论区
请写下您的评论...
暂无评论...
猜你喜欢
前端(h5) 2124 1.树状基于上篇,模拟使线性顺序h了树状,只是变化,本将使实际案例,实现并实现点击定位平滑移动。2.案例点击title,页面
javascript js html 1240 展示将区域h具体代码下载下来看看吧~
数据结构与算法 1993 代码:组a是未排序集合,已排序集合是逻辑上一个集合,可以看作是head,实现是一个,add方法集合添加,每次找到对应位置,使有序,toArray方法使已排序集合输出int
数据结构与算法 1847 者,求胜编号,以及出局者顺序。解决方案使循环测试m=9,n=5输出:517436928代码(c++描述)Node.h#pragmaonceclassNode{public: i
linux系统 5631 linux/bin:/usr/bin:可执行二进制,如常命令ls、tar、mv、cat等。/boot:放置linux系统启动时一些件。/boot/vmlinuz为
数据结构与算法 1764 prim(普里姆)算法求出。对于任何一个或算法,理解和实现只是一个方面,更重要是要明白它范围或应场景,最小树算法非常广泛,例如:假设要在n个城市之间建立通信联络网,则连接n个
数据结构与算法 8005 反转有一个单t如下:t=1-2-3-4-5-6-7-8-9写一个方法反转t如下:1-2-3-4-5-6-7-8-9=tjava代码:packagetest;/*** 节点类
数据结构与算法 12867 -图着色问题问题描述:图m-着色判定问题——定无连通图G和m种不同颜色。这些颜色为图G各顶点着色,每个顶点着一种颜色,是否有一种着色法使G任意相邻2个顶点着不同颜色?个人感
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1 2024-08  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript 加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。