我需要递归地解析JSON对象。
下面是一个示例JSON:
const obj = {
tag: 'AA',
type: 'constructed',
value: 'ABCD1',
child: [
{
tag: 'BB',
type: 'constructed',
value: 'ABCD2',
child: [
{
tag: 'CC',
type: 'constructed',
value: 'ABCD3',
child: [
{
tag: 'DD',
type: 'primitive',
value: 'ABCD4',
child: []
},
{
tag: 'EE',
type: 'constructed',
value: 'ABCD5',
child: [
{
tag: 'FF',
type: 'primitive',
value: 'ABCD6',
child: []
},
{
tag: 'GG',
type: 'primitive',
value: 'ABCD7',
child: []
}
]
},
{
tag: 'HH',
type: 'primitive',
value: 'ABCD8',
child: []
}
]
}
]
},
{
tag: 'II',
type: 'primitive',
value: 'ABCD9',
child: []
}
]
}
输出应该类似于:
{
"AA": [
{
"BB": [
{
"CC": [
{
"DD": "ABCD4"
},
{
"EE": [
{
"FF": "ABCD6"
},
{
"GG": "ABCD7"
}
]
},
{
"HH": "ABCD8"
}
]
}
]
},
{
"II": "ABCD9"
}
]
}
基本上,constructed
类型的对象应该有一个嵌套对象,primitive
类型的对象应该直接有一个键-值对,对象可以很深,可以在同一层上有构造对象和原始对象(如我的例子)。
下面是我目前的代码:
let jsonOutput = {}
parseData(obj, jsonOutput)
function parseData(jsonToParse, jsonOutput) {
const type = jsonToParse.type
const tag = jsonToParse.tag
const value = jsonToParse.value
let prev = jsonOutput
if (type === 'constructed') {
prev[tag] = []
return parseData(jsonToParse.child[0], prev[tag])
} else if (type === 'primitive') {
prev[tag] = value
return parseData(jsonToParse.child, prev[tag])
}
}
这是我的小提琴:https://jsfiddle.net/kzaiwo/0v6a2tp8/16/
但是我不能让它遍历整个对象。递归不是我真正擅长的领域,但我认为这是实现它的最佳方式。我错过了什么?请帮助!
谢谢!
2条答案
按热度按时间mutmk8jj1#
希望这对你有帮助,
uklbhaso2#
您可以使用以下递归
reduceObj(obj)
函数,该函数简短而简洁:ES6之前的函数语法: