当前位置: 首页 > 知识库问答 >
问题:

嵌套结构的生成算法

程项禹
2023-03-14

我有以下结构:

{
  "list": [
    { "depth": 0, "data": "lorem1" },
    { "depth": 1, "data": "lorem2" },
    { "depth": 2, "data": "lorem3" },
    { "depth": 2, "data": "lorem4" },
    { "depth": 0, "data": "lorem5" },
    { "depth": 1, "data": "lorem6" },
    { "depth": 1, "data": "lorem7" },
    { "depth": 2, "data": "lorem8" }
  ]
}

我正在寻找一种算法,如何从深度创建一个类似父子嵌套的结构。

{
  "list": [{
    "depth": 0,
    "data": "lorem1",
    "children": [{
      "depth": 1,
      "data": "lorem2",
      "children": [{
        "depth": 2,
        "data": "lorem3",
        "children": [],
      }, {
        "depth": 2,
        "data": "lorem4",
        "children": [],
      }]
    }]
  }, {
    "depth": 0,
    "data": "lorem5",
    "children": [{
      "depth": 1,
      "data": "lorem6",
      "children": [],
    }, {
      "depth": 1,
      "data": "lorem7",
      "children": [{
        "depth": 2,
        "data": "lorem8",
        "children": [],
      }]
    }]
  }
]}

逻辑是这样的:

  • 假设:列表中的第一项总是以深度=0开头
  • 如果深度大于最后一个,它必须是最后一个的孩子

我没法让它工作。它应该是递归的,具有无限嵌套/深度级别。

谢谢你们的帮助!

共有1个答案

阎功
2023-03-14

可以使用堆栈跟踪树中的当前路径。当深度从一个增加到下一个时,将新节点也推到该堆栈上。如果没有,则从堆栈中弹出项目,直到达到正确的深度。然后,您总是知道需要在哪个子对象集合中添加新节点。

下面是一个可运行的JavaScript实现:

function algo(list) {
    // Create a dummy node to always stay at the bottom of the stack:
    let stack = [
        { "depth": -1, "data": "(root)", "children": [] }
    ];
    
    for (let node of list) {
        let newNode = { ...node, children: [] }; // Copy and add children property
        if (newNode.depth >= stack.length || newNode.depth < 0) throw "Invalid depth";
        while (newNode.depth < stack.length - 1) stack.pop();
        stack[stack.length - 1].children.push(newNode);
        stack.push(newNode);
    }
    
    return stack[0].children;
}

// Demo
let data = {
  "list": [
    { "depth": 0, "data": "lorem1" },
    { "depth": 1, "data": "lorem2" },
    { "depth": 2, "data": "lorem3" },
    { "depth": 2, "data": "lorem4" },
    { "depth": 0, "data": "lorem5" },
    { "depth": 1, "data": "lorem6" },
    { "depth": 1, "data": "lorem7" },
    { "depth": 2, "data": "lorem8" }
  ]
}

// Create a new structure, and load the transformed list in its list property:
let result = {
    "list": algo(data.list)
};

// Show result
console.log(result);

 类似资料:
  • 本文向大家介绍C++ 嵌套类/结构,包括了C++ 嵌套类/结构的使用技巧和注意事项,需要的朋友参考一下 示例 甲class或struct还可以包含另一个class/struct内部本身的定义,这被称为“嵌套类”; 在这种情况下,包含类称为“封闭类”。嵌套类定义被认为是封闭类的成员,但在其他方面则是单独的。 从封闭类的外部,可以使用范围运算符访问嵌套类。但是,在封闭类的内部,可以使用没有限定符的嵌套

  • 4. 嵌套结构体 结构体也是一种递归定义:结构体的成员具有某种数据类型,而结构体本身也是一种数据类型。换句话说,结构体的成员可以是另一个结构体,即结构体可以嵌套定义。例如我们在复数的基础上定义复平面上的线段: struct segment { struct complex_struct start; struct complex_struct end; }; 从第 1 节 “复合类型与结构体”

  • 考虑以下两个用于的重载: 如果我将对象与进行比较,将为我生成正确的运算符,所以像、

  • 问题内容: http://play.golang.org/p/f6ilWnWTjm 我正在尝试解码以下字符串,但仅获取空值。 如何在Go中解码嵌套的JSON结构? 我想将以下内容转换为地图数据结构。 问题答案: 在Go中使用嵌套结构来匹配JSON中的嵌套结构。 这是一个如何处理示例JSON的示例: 游乐场链接 您还可以对内部结构使用匿名类型: 游乐场链接 或外部和内部结构: 游乐场链接 如果您不知

  • 问题内容: 我不知道如何初始化嵌套结构。在此处找到示例:http: //play.golang.org/p/NL6VXdHrjh 问题答案: 好吧,有什么特定的原因不使Proxy成为自己的结构? 无论如何,您有2个选择: 正确的方法是,只需将proxy移至其自己的结构,例如: 不太正确和丑陋的方法,但仍然有效:

  • 问题内容: 我已经开始使用https://mholt.github.io/json-to-go/将API JSON转换为go结构,但我真的很喜欢它,但是我仍然坚持如何在Report Definition结构中初始化Filters数组结构如下所示。 我似乎无法引用在Filters结构甚至是Filters结构中声明的项,以创建新的Filter项目并将其附加到Filters。 是否可以使用原样编写的Re