前言
有一个多行字符串,每行开头用空格表示其层次关系。 每层的空格总数为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));
图像-
图像 - 示例代码
请移至本文中使用的代码的完整版本:
写在最后