递归创建嵌套数组

4

有什么建议可以递归地创建一组嵌套的数组/对象吗?

我让我的用户使用快速文本区域添加多个元素。他们将用星号表示子项。 因此,我有一个字符串,我想把它转换成数组。

level 1.1
level 1.2
* level 1.2.1
** level 1.2.1.1
** level 1.2.1.2
* level 1.2.2

这是我想看到的结果:
[
    {
        name: "level 1.1"
    },
    {
        name: "level 1.2",
        nodes: [
            {
                name: "level 1.2.1",
                nodes: [
                    {
                        name: "level 1.2.1.1"
                    },
                    {
                        name: "level 1.2.1.2"
                    }
                ]
            },
            {
                name: "level 1.2.2"
            }
        ]
    }
]

挑战在于我不知道节点将会深入多少。

如有建议,不胜感激。


4
...你尝试过的是什么? - Stéphane Ammar
作业,哈!这让我想起了很久以前的可怕回忆。现在正在发生的事情是,我正在给人们一个机会通过文本区域一次创建多个项目,如果他们想要某些项目成为嵌套项目,那么他们可以添加星号。因此,输入数据如下所示。 - Zagreus
@Zagreus 听起来像是留下了很多用户错误的空间。我建议为您的用户提供一个构建嵌套结构的界面。 - JLRishe
1个回答

4

这是一种线性的方法,没有使用递归。

您可以数星星并将此信息视为所需节点的级别。

该方案使用数组作为对最后插入级别的参考,并维护所需的对象结构。

此解决方案不提供完整性检查,如果缺少某个级别。

var data = ['level 1.1', 'level 1.2', '* level 1.2.1', '** level 1.2.1.1', '** level 1.2.1.2', '* level 1.2.2'],
    result = [],
    levels = [{ nodes: result }];

data.forEach(function (s) {
    var level = (s.match(/^\*+(?=\slevel)/) || [''])[0].length,
        name = s.match(/[^*]+$/)[0].trim();

    levels[level].nodes = levels[level].nodes || [];
    levels[level].nodes.push(levels[level + 1] = { name: name });
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


太好了,谢谢。如果我理解正确的话,您正在使用正则表达式来计算有多少个*。我会加入快速验证以确保没有遗漏的级别,然后就可以开始了。 - Zagreus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接