Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript将纯文本列表转换为HTML列表_Javascript_Arrays_Sorting_Multidimensional Array_Html Lists - Fatal编程技术网

使用JavaScript将纯文本列表转换为HTML列表

使用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

我经常收到PDF格式的文本列表,它们是分层的(通常有三层)。我想把它们放到HTML列表中,这样它们就可以用CSS来设计样式,并且更具表现力。由于数据量很大,我正试图用JavaScript自动化这个过程

示例源数据: 示例目标: 在这里,我很难弄清楚如何对所有这些进行排序。感谢您的帮助。

不需要Regexp

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"]
                ]
            ]
        ]
    ]