【问题标题】:Recursively create a nested array递归创建嵌套数组
【发布时间】:2017-11-27 17:30:24
【问题描述】:

关于如何递归地创建一组嵌套数组/对象有什么建议吗?

我让我的用户使用快速文本区域添加多个元素。它们将用星号指示子项目。所以我有一个这样的字符串,我想把它变成一个数组。

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

挑战在于我不知道节点会下降到什么深度。

如有任何建议,我们将不胜感激。

【问题讨论】:

  • ...而您尝试的是???
  • 家庭作业,哈!勾起很久以前可怕的回忆。正在发生的事情是,我让人们有机会通过文本区域一次创建多个项目,如果他们希望某些内容成为嵌套项目,那么他们可以添加星号。所以输入数据是给定的。
  • @Zagreus 听起来会为用户错误留下很多空间。我建议为您的用户提供一个用于构建嵌套结构的界面。

标签: javascript arrays recursion


【解决方案1】:

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

您可以计算星数并将此信息用于给定节点的所需级别。

此提议使用数组作为对最后插入的级别的引用,并维护所需的对象结构。

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

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; }

【讨论】:

  • 太好了,谢谢。如果我理解它,您正在使用正则表达式来计算有多少 * s。我将进行快速验证,以确保没有错过任何关卡,我应该一切顺利。
猜你喜欢
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2014-07-17
相关资源
最近更新 更多