在JavaScript中从平面数组生成树结构(不使用对象引用)
作者:互联网
我正在尝试通过平面数组在JavaScript中生成树结构.这通常是一个非常简单的命题-只需保留一个“堆栈”数组,并引用按嵌套深度排序的当前工作范围的祖先对象-在进入另一个嵌套级别时将一个新元素推入堆栈,并在离开时将其弹出一种,将当前工作元素替换为(新)最后一个数组项引用的对象.
不幸的是,这需要传递引用的能力,而JavaScript没有(我知道如何使用此有意义的方式来解决这个问题).
为了提供一些背景知识,我试图将包含嵌套XML样式(但不是XML,因此不能使用XML解析器)标记的任意长/复杂的字符串转换为类似于以下内容的结构:
预期输入:
[
"<token>",
"<my non compliant token>",
"some text at this level",
"<some other token>",
"some more text",
"<yet another token>",
"more text",
"</yet another token>",
"blah!",
"</some other token>",
"</token>",
"more text"
]
预期产量
[
{
"token": "<token>",
"children": [
{
"token": "<my non compliant token>",
"children": [
"some text at this level",
{
"token": "<some other token>",
"children": [
"some more text",
{
"token": "<yet another token>",
"children": [ "more text" ]
},
"blah!"
]
}
]
}
]
},
"more text"
]
需要澄清的是-我并不需要一个完整的算法(但是如果您想提供实现,我会很感兴趣)-只是一种用于维持输出树中当前位置的好方法(或者一种完全不同/更好的生成树的方法)对象!)不要太了解令牌的工作原理-它们不是XML,并且出于练习目的,可以采用完全不同的格式.
任何投入将不胜感激!
解决方法:
您的字符串看起来很容易解析.我想我会做这样的事情:
var stack = [];
var array = [];
for (var i in strings) {
var s = strings[i];
if (s.indexOf("</") == 0) {
array = stack.pop();
} else if (s.indexOf("<") == 0) {
var obj = {token: s, children: []};
array.push(obj);
stack.push(array);
array = obj.children;
} else {
array.push(s);
}
}
标签:data-structures,tree,javascript,algorithm 来源: https://codeday.me/bug/20191208/2089746.html