将字符串转换为Javascript中的对象

我在使用特定映射转换字符串时遇到麻烦。我要转换的字符串如下:

输入值

$B$O$TT$O$$KK$$Z$HH$$U$PP$$QQ$U$Z$B$

可以更好地将其视为以下内容(非常接近HTML):

$B
  $O
    $TT$
  O$
  $K
  K$
  $Z
    $HH$
    $U
      $PP$
      $QQ$
    U$
  Z$
B$

我的目标是将其转换为以下内容:

预期结果

{
  "v": "B",
  "chld": [
    {
      "v": "O",
      "chld": [
        {
          "v": "T"
        }
      ]
    },
    {
      "v": "K"
    },
    {
      "v": "Z",
      "chld": [
        {
          "v": "H"
        },
        {
          "v": "U",
          "chld": [
            {
              "v": "P"
            },
            {
              "v": "Q"
            }
          ]
        }
      ]
    }
  ]
}

我得到的继承人:

function transform(contentString, currentObj, currentChld) {
  let closeOpen = {
    open: /\$[A-Z]/i,
    closed: /[A-Z]\$/i 
  }

  if (!contentString.length) {
    return currentObj
  }

  let currentSlice = contentString.slice(0, 2)
  let newString = contentString.substring(2)
  //See if tag is open, for example $A is open, A$ is closed
  if (currentSlice.match(closeOpen['open'])){
    currentObj = {v: currentSlice[1]}
    currentObj.chld = []
    return transform(newString,  currentObj , currentChld)

  }

}

似乎递归还没有开始。解决方案不必是递归的。如果有更简单的东西也可以!我的希望是获得上述预期的结果。有人可以帮忙吗?最简单的解决方案将是最好的!

编辑:是的标签将只有一个字母,仅限于 [A-Z]

莫里兹·罗斯勒

我参加聚会很晚,但是基于堆栈的简单方法效果很好。

var str = "$B$O$TT$O$$KK$$Z$HH$$U$PP$$QQ$U$Z$B$"

function convert(str) {
  var nodes = str.match(/../g)

  var node, parent, stack = [{
    chld: []
  }];

  for (key of nodes) {
    parent = stack.slice(-1)[0]
    if (key[0] == "$") {
      node = {
        v: key[1],
        chld: []
      }
      parent.chld.push(node);
      stack.push(node)
    } else if (key[1] == "$") {
      node = stack.pop()
      if (!node.chld.length) delete node.chld
    }

  }
  return stack.pop().chld[0]
}
console.log(convert(str));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章