javascript实现根据字符串缩进生成无限目录树

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截图

生成的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": [
          
        ]
      }
    ]
  }
]

}
]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值