简体   繁体   English

如何将字符串的缩进级别解析为 JSON Object?

[英]How do I parse the indentation level of a string into a JSON Object?

I'd like to be able to parse a string into a JSON Object, something like this (the text can be anything, I'm just putting them like this so you can see the structure):我希望能够将一个字符串解析为 JSON Object,类似这样的(文本可以是任何东西,我只是把它们这样放置,以便您可以看到结构):

A
  A-A
  A-B
    A-B-A
    A-B-B
  A-C
    A-C-A
B

into a json object, structured like this:进入 json object,结构如下:

[
  {
    "root": "A",
    "content": [
      { "root": "A-A", "content": [] },
      {
        "root": "A-B",
        "content": [
          { "root": "A-B-A", "content": [] },
          { "root": "A-B-B", "content": [] }
        ]
      },
      {
        "root": "A-C",
        "content": [
          { "root": "A-C-A", "content": [] }
        ]
      }
    ]
  },
  { "root": "B", "content": [] }
]

So far, I have the following, but I'm not sure if this is the best way of doing it.到目前为止,我有以下内容,但我不确定这是否是最好的方法。 Maybe a recursive approach would be better?也许递归方法会更好?

  let body = [];
  let indentStack = [0];
  for (let line of input.split('\n')) { // input is the string I'd like to parse
    if (line.trim() == '') continue; // skips over empty lines
    let indent = line.match(/^ +/);
    indent = indent ? indent[0].length : 0; // matches the first group of spaces with regex, gets the indent level of this line
    if (indentStack[indentStack.length-1] != indent) 
      if (indentStack.includes(indent)) indentStack.length = indentStack.indexOf(indent)+1; // remove all indent levels after it as it's returned back to a higher level
      else stack.push(indent);
    console.log(`${(indent + '[' + indentStack.join() + ']').padEnd(10, ' ')}: ${line}`); // debugging
      
    if (indentStack.length == 1) body.push({ root: line, content: [] });
    else {
      body[body.length-1].content.push({ root: line.substring(indent), content: [] })
    }
  }
  console.log(body)

I will do that this way:我会这样做:

 const data = `A AA AB ABA ABB AC ACA B`; function doTree(data) { let res = [], levels = [ res ]; for (let line of data.split('\n')) { let level = line.search(/\S/) >> 1 // (index of first non whitespace char) / 2 --> IF indentation is 2 spaces, root = line.trim(), content = []; if (.root) continue levels[level],push({root.content}) levels[++level] = content } return res } console.log( doTree(data) )
 .as-console-wrapper {max-height: 100%;important:top:0 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM