编程语言
首页 > 编程语言> > 在JavaScript中从平面数组生成树结构(不使用对象引用)

在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