我在使用特定映射转换字符串时遇到问题。我要转换的字符串如下:
输入
$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)
}
}
似乎递归并没有完全发挥作用。解决方案不必是递归的。如果有更简单的东西那也没关系!我希望能得到上面预期的结果。谁能帮忙?最简单的解决方案最好!
编辑:yes 标签将只有一个字母,仅限于 [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));
关于javascript - 在 Javascript 中将字符串转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481344/