前言里有多行字符串。每行的开头使用空格来指示其层次关系。每层的空格总数为2,如何转换成json格式的树状数据?本文将把这个算法分享给大家。欢迎有兴趣的开发者阅读本文。比如有一个字符串:consttext=`LanguageJavaScriptTypeScriptNodeJSHTMLServerDataBaseMongoDBSystemLinuxWindow`;将其转换为分层结构的json数据后:[{"name":"TypeScript"},{"name":"NodeJS"}]},{"name":"HTML"}]},{"name":"Server","children":[{“名称”:“数据库”,“孩子”:[{“名称”:“MongoDB”}]}}]},{"name":"System","children":[{"name":"Linux"},{"name":"Window"}]}]}思路分析乍一看,要处理字符串,好像没有更好的办法,我想不通。当我们遇到这样的问题,直接从数据结构上想不出解决办法的时候,这时候我们可能就要换个思路了。我们可以将它转换成另一种数据吗?结构呢?复习题后发现,我们需要的数据元素在字符串中总是占一行,所以我们要对每一行进行处理。这时候最好的办法就是切割成数组。然后,我们以换行符为切入点构造数组如下:["","Language","JavaScript","TypeScript","NodeJS","HTML","Server","DataBase","MongoDB","System","Linux","Window",""]观察数组中的每一个元素,我们发现最上面的数据开头没有空格,而开头会多出两个空格每一层。从前到后依次读取数据,将后面的数据与前面的数据进行比较,然后判断它们之间的层次关系。分析完这一点,相信很多开发者都看出了这种比较方式满足“后进先出”的原则。因此,我们可以使用栈来解决这个问题,如下图:准备2个栈,一个用于存储每层的A字符串,另一个用于存储每一层的空格数。默认情况下,root被压入堆栈,其空格数设置为-1。接下来,我们将每个元素逐一入栈,并分析其过程。如下图所示,我们列出了一些元素的比较过程。经过观察,我们总结出以下规律。获取入栈元素的总空格数获取栈顶(deepStack)元素,判断入栈元素的总空格数是否大于栈顶元素。如果满足条件,则获取strStack的栈顶元素,并将入栈元素放入其child;否则,将两个栈的元素依次出栈。直到入栈元素的总空格数大于deepStack的栈顶元素,得到strStack的栈顶元素,将入栈元素放入其child中,将入栈元素及其总空格数放入对应的栈中,直到所有元素都入栈比较,这个问题就解决了。注:为了让读者更直观的看到规则,strStack栈中的元素直接用字符串代替。事实上,栈中存储的数据是一个对象,对象包含name属性和children属性。当前的堆叠元素也将被构造为一个对象。得到栈顶元素(deepStack)与栈顶元素总空间数的比较结果后,将栈顶元素对象放入栈顶元素(strStack)的子节点中。实现代码经过上面的分析,我们得出了一个完整的实现思路。接下来我们看一下代码的实现。/***字符串到树结构*@paramtext*@constructor*/exportfunctionDataConversion(text:string):nodeObj{constsplitArr=text.split("\n");constjson={名称:“根”};conststrStack=newStack();constdeepStack=newStack();strStack.push(json);deepStack.push(-1);for(leti=0;i
