推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

字符串转树结构

   2023-08-09 网络整理佚名850
核心提示:有一个多行字符串,每行开头会用空格来表示它的层级关系,每间隔一层它的空格总数为2,如何将它转为json格式的树型数据?那么,我们就以换行符作为切割点来构造数组,如下所示:注意:为了让读者更直观的看出规律,栈中的元素用字符串直接代替了,实际上栈中存储的数据是一个对象,该对象包含了name属性和属性。

前言

有一个多行字符串,每行开头空格表示其层次关系。 每层的空格总数为2,如何转化为json格式的树数据? 本文将与大家分享这个算法。 欢迎感兴趣的开发者阅读本文。

例如有一个字符串:

const text = `
Language
  Javascript
    Typescript
    NodeJS
  HTML
Server
  Database
    MongoDB
System
  Linux
  Window
`
;

转换为具有层次结构的json数据后:

{
    "name":"root",
    "children":[
        {
            "name":"Language",
            "children":[
                {
                    "name":"Javascript",
                    "children":[
                        {
                            "name":"Typescript"
                        },
                        {
                            "name":"NodeJS"
                        }
                    ]
                },
                {
                    "name":"HTML"
                }
            ]
        },
        {
            "name":"Server",
            "children":[
                {
                    "name":"Database",
                    "children":[
                        {
                            "name":"MongoDB"
                        }
                    ]
                }
            ]
        },
        {
            "name":"System",
            "children":[
                {
                    "name":"Linux"
                },
                {
                    "name":"Window"
                }
            ]
        }
    ]
}

想法分析

乍一看,似乎没有更好的方法来处理字符串,我想不通。 当我们遇到这样一个无法直接从数据结构中想到解决方案的问题时,这个时候我们可能就得改变思路了。 我们可以将其转换为另一种数据结构吗?

回顾问题后,我们发现我们需要的数据元素总是占据字符串中的一行,因此我们必须对每一行进行处理。 这时候最好的办法就是切成数组

然后,我们以换行符为切点来构造数组,如下:

[
  "","Language","  Javascript""    Typescript","    NodeJS",   "  HTML","Server","  Database","    MongoDB","System","  Linux","  Window",""
]

观察数组中的每个元素后,我们发现最顶层数据的开头没有空格,并且每层的开头都会多出两个空格。 从前往后顺序读取数据,将后面的数据与前面的数据进行比较,然后确定它们之间的层次关系。

经过分析这一点,相信很多开发者都看出了这种比较方式满足“后进先出”的原则。 因此,我们可以使用栈来解决这个问题,如下所示:

图像-

接下来我们将每个元素一一压入栈并分析其过程。 如下图所示,我们列出了一些元素的对比过程。 经过观察,我们总结出以下规律。

将入栈的元素及其总空格数放入对应的栈中

直到所有元素都压入栈并进行比较后这个问题就解决了

图像-

注:为了让读者更直观的看到规则,栈中的元素直接替换为字符串。 实际上,栈中存储的数据是一个对象,其中包含名称属性和属性。 当前堆叠的元素也将被构造为一个对象。 得到栈顶元素()与栈顶元素总空格数的比较结果后,将栈顶元素对象放入栈顶元素()中。

实现代码

经过上面的分析,我们已经得出了一个完整的实现思路。 接下来我们看一下代码的实现。


export function DataConversion(text: string): nodeObj {
  const splitArr = text.split("\n");

  const json = { name: "root" };
  const strStack = new Stack();
  const deepStack = new Stack();
  strStack.push(json);
  deepStack.push(-1);

  for (let i = 0; i < splitArr.length; i++) {
    let str = splitArr[i];
    if (!str) continue;
    // 获取空格总数
    const len = str.lastIndexOf(" ") + 1;
    str = str.replace(/\s/g"");
    const curObj = { name: str };

    // 寻找当前入栈元素的父层级
    while (len <= deepStack.peek()) {
      deepStack.pop();
      strStack.pop();
    }
    const stackTop: nodeObj = strStack.peek();
    stackTop.children
      ? stackTop.children.push(curObj)
      : (stackTop.children = [curObj]);

    // 元素入栈,继续下一轮的比对
    strStack.push(curObj);
    deepStack.push(len);
  }

  return json;
}

注意:上面的代码声明了一个自定义类型和一个自定义类Stack,完整代码请查看示例代码。

最后,我们将一开始的例子代入上面的代码中,看看是否能够正确解决问题。

const text = `
Language
  Javascript
    Typescript
    NodeJS
  HTML
Server
  Database
    MongoDB
System
  Linux
  Window
`
;

const textJSON = DataConversion(text);
console.log(JSON.stringify(textJSON));

图像-

图像 - 示例代码

请移至本文中使用的代码的完整版本:

写在最后

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON