javascript实现根据字符串缩进生成无限目录树
let sourceString = `
第一章
第一节 药品
一、中药
二、西药
三、合成药
四、中西医结合
1.结合治疗方法
第二节 护理
第三节 治疗
一、手术治疗
二、给药治疗
1.给药方法
2.注意事项
第二章
第一节 c与语言
一、指针
二、结构体
第二节 java
一、面向对象
二、接口
`;
let result = {
name: '第一章',
childs: [
{
name: '第一节',
childs: []
},
{
name: '第二节',
childs: []
}
]
}
function getlevel(str) {
var num = 0;
while (str.search(" ") != -1) {
num++;
str = str.replace(" ", "");
}
return num;
}
function getname(str) {
var num = 0;
while (str.search(" ") != -1) {
num++;
str = str.replace(" ", "");
}
return str;
}
function createtree(str) {
var arr = [];
var array = [];
var list = str.split("\n");
var stack = [];
var dict = {};
for (i = 0; i < list.length - 2; i++) {
arr[i] = {};
arr[i]["name"] = list[i + 1];
arr[i]["childs"] = [];
}
var arrCount = arr.length;
for (i = 0; i < arrCount; i++) {
var level = getlevel(arr[i].name);
var titlename = getname(arr[i].name);
arr[i].name = titlename;
if (level == 0 && stack.length == 0) {
stack.push(arr[i]);
}
else if (level == 0 && stack.length > 0) {
array.push(stack[0]);
var arrnums=stack.length;
for (j = 0; j < arrnums; j++) {
stack.pop();
}
stack.push(arr[i]);
}
else if (stack.length > 0 && level > 0) {
var stackCount = stack.length;//务必记住
for (j = 0; j < stackCount - level; j++) {
stack.pop();
}
stack.push(arr[i])
stack[level - 1].childs.push(arr[i]);
}
}
array.push(stack[0]);
console.log(JSON.stringify(array));
}
createtree(sourceString);
生成的JSON数据:
[{“name”:“第一章”,“childs”:[{“name”:“第一节 药品”,“childs”:[{“name”:“一、中药”,“childs”:[]},{“name”:“二、西药”,“childs”:[]},{“name”:“三、合成药”,“childs”:[]},{“name”:“四、中西医结合”,“childs”:[{“name”:“1.结合治疗方法”,“childs”:[]}]}]},{“name”:“第二节 护理”,“childs”:[]},{“name”:“第三节 治疗”,“childs”:[{“name”:“一、手术治疗”,“childs”:[]},{“name”:“二、给药治疗”,“childs”:[{“name”:“1.给药方法”,“childs”:[]},{“name”:“2.注意事项”,“childs”:[]}]}]},{“name”:“第一节 c与语言”,“childs”:[{“name”:“一、指针”,“childs”:[]},{“name”:“二、结构体”,“childs”:[]}]},{“name”:“第二节 java”,“childs”:[{“name”:“一、面向对象”,“childs”:[]},{“name”:“二、接口”,“childs”:[]}]}]}]
生成的JSON截图
使用BEJSON格式化截图
格式化后的数据
[
{
“name”: “第一章”,
“childs”: [
{
“name”: “第一节 药品”,
“childs”: [
{
“name”: “一、中药”,
“childs”: [
]
},
{
"name": "二、西药",
"childs": [
]
},
{
"name": "三、合成药",
"childs": [
]
},
{
"name": "四、中西医结合",
"childs": [
{
"name": "1.结合治疗方法",
"childs": [
]
}
]
}
]
},
{
"name": "第二节 护理",
"childs": [
]
},
{
"name": "第三节 治疗",
"childs": [
{
"name": "一、手术治疗",
"childs": [
]
},
{
"name": "二、给药治疗",
"childs": [
{
"name": "1.给药方法",
"childs": [
]
},
{
"name": "2.注意事项",
"childs": [
]
}
]
}
]
},
{
"name": "第一节 c与语言",
"childs": [
{
"name": "一、指针",
"childs": [
]
},
{
"name": "二、结构体",
"childs": [
]
}
]
},
{
"name": "第二节 java",
"childs": [
{
"name": "一、面向对象",
"childs": [
]
},
{
"name": "二、接口",
"childs": [
]
}
]
}
]
}
]