使用JavaScript将纯文本列表转换为HTML列表
我经常收到PDF格式的文本列表,它们是分层的(通常有三层)。我想把它们放到HTML列表中,这样它们就可以用CSS来设计样式,并且更具表现力。由于数据量很大,我正试图用JavaScript自动化这个过程 示例源数据: 示例目标: 在这里,我很难弄清楚如何对所有这些进行排序。感谢您的帮助。不需要Regexp使用JavaScript将纯文本列表转换为HTML列表,javascript,arrays,sorting,multidimensional-array,html-lists,Javascript,Arrays,Sorting,Multidimensional Array,Html Lists,我经常收到PDF格式的文本列表,它们是分层的(通常有三层)。我想把它们放到HTML列表中,这样它们就可以用CSS来设计样式,并且更具表现力。由于数据量很大,我正试图用JavaScript自动化这个过程 示例源数据: 示例目标: 在这里,我很难弄清楚如何对所有这些进行排序。感谢您的帮助。不需要Regexp var log=console.log; 风险值数据=`・第一级1列表项 –第一级2列表项,是第一级1列表项的子集。 –第二级2列表项,是第一级1列表项的子集。 ♦ 第一级3列表项,是第二级2
var log=console.log;
风险值数据=`・第一级1列表项
–第一级2列表项,是第一级1列表项的子集。
–第二级2列表项,是第一级1列表项的子集。
♦ 第一级3列表项,是第二级2列表项的子集。
・第二级1列表项;
//将文本拆分为字符串数组。每行一项
data=data.split(“\n”);
var firstChar,prevFirstChar=“”;
//我们的输出结构
var struct=[];
var cursor=struct;
//我们只需要一个令牌就可以返回一级
变量lvl1Key=”・";
var prevnode={};
data.forEach(行=>{
//领取代币
firstChar=line.charAt(0);
让节点={
str:line.slice(1),
儿童:[]
};
if(firstChar==lvl1Key){
//返根
游标=结构;
}else if(firstChar!=prevFirstChar){
//如果令牌更改且不是根令牌,则上移
cursor=prevnode.child;
}
push(节点);
prevnode=节点;
prevFirstChar=firstChar;
});
日志(结构);
//好的,我们得到struct,把它转换成html
//格式化偏移量
常数offsetSize=2;
//递归函数节点{str:“string”,childs:[节点]}的数组
var toHtml=函数(节点,偏移量=){
var ret=offset+“\n”;
偏移量+=“”。重复(偏移量大小);
node.forEach(rec=>{
ret+=offset+“- ”+rec.str+“
\n”;
//如果数组不为空,则为child添加html
if(记录子项长度){
ret+=toHtml(rec.child,offset+“”.repeat(offsetSize));
}
});
offset=offset.slice(offsetSize);
ret+=偏移量+“
\n”;
返回ret;
}
日志(toHtml(struct))
为什么要将它们都集中到一个数组中?你不能一个一个地匹配每个级别并相应地推送它们吗?@Darkrum当然!如果这是一个更好的解决方案,那就太好了!我只是想解释我到目前为止的方法,这是我最容易概念化的方法。但我不坚持这样做。太好了,谢谢!你介意解释一下吗代码工作原理?好的,等一下。@精神主义者您不需要顶级列表中的所有标记,因为任何非根标记(与以前的标记不同)都会在层次结构上向下移动项。您只需迭代项并记住层次结构中的节点即可插入它们。谢谢。您添加到代码中的注释很有帮助。我已经理解了一半现在就看它是如何工作的。我剩下的问题(如果你不介意回答的话)是:・firstChar
&prevFirstChar
-这些功能是什么?・什么是结构?・<代码>光标-是用于循环迭代的吗?・prevnode的情况如何?・offsetSize
是如何工作的,为什么是2?・ret
在返回之前发生了什么?struct
-带树的根对象。光标
此树的指针。我们必须保留插入新节点的位置。firstChar
,prevFirstChar
-字符串的第一个字符,我们的标记('・','–','♦', ...) - 当前和旧的,如果它们不相等,我们会深入树中。prevnode
-最后插入的节点,如果标记不同,我们会插入他的child
数组。offsetSize
result html中缩进的空格数。Evety调用toHtml
incraces offset。以及在- 之后和之前添加和删除空格空格数。它可以是0或4或其他。
ret
-返回值,每次追加时只返回html字符串。
・First Level 1 list item
– First Level 2 list item, which is a subset of the first Level 1 list item.
– Second Level 2 list item, which is a subset of the first Level 1 list item.
♦ First Level 3 list item, which is a subset of the second Level 2 list item.
・Second Level 1 list item.
<ul>
<li>First Level 1 list item</li>
<ul>
<li>First Level 2 list item, which is a subset of the first Level 1 list item.</li>
<li>Second Level 2 list item, which is a subset of the first Level 1 list item.
<ul>
<li>First Level 3 list item, which is a subset of the second Level 2 list item.</li>
</ul>
</li>
</ul>
<li>Second Level 1 list item.</li>
</ul>
list
[
level1
[
level2
[
level3
[
string
["list item text"]
]
]
]
]