递归解析嵌套JSON对象:代码无法完整遍历问题求助
问题分析与解决方案
你的代码核心问题是没有遍历所有子节点,且递归逻辑存在错误,导致只处理了第一个子元素,忽略了其他同级节点。以下是修正后的实现和问题解析:
原代码的问题点
- 处理
constructed类型时,仅取了child[0],完全忽略了同一层级的其他子节点(比如示例中的II节点) primitive类型节点不需要递归处理child(因为其child为空数组),原代码错误地将child传入递归函数- 递归逻辑没有处理数组类型的子节点集合,每个子元素都需要单独处理并加入结果数组
修正后的代码
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: [] } ] }; function parseNode(node) { // 原始类型直接返回键值对 if (node.type === 'primitive') { return { [node.tag]: node.value }; } // 构造类型需要遍历所有子节点,递归处理后放入数组 const childrenResult = node.child.map(child => parseNode(child)); return { [node.tag]: childrenResult }; } const jsonOutput = parseNode(obj); console.log(JSON.stringify(jsonOutput, null, 2));
代码逻辑说明
- 递归函数职责单一:
parseNode接收单个节点,返回该节点对应的处理结果 - 原始类型处理:直接生成
{ tag: value }的键值对,无需递归子节点 - 构造类型处理:遍历所有子节点,对每个子节点递归调用
parseNode,将所有子节点的结果收集到数组中,最终生成{ tag: [子节点结果数组] }的结构 - 自动处理层级:无论嵌套多深,递归都会逐层处理每个节点,保证所有层级和同级节点都被覆盖
输出结果
执行后会生成你预期的结构:
{ "AA": [ { "BB": [ { "CC": [ { "DD": "ABCD4" }, { "EE": [ { "FF": "ABCD6" }, { "GG": "ABCD7" } ] }, { "HH": "ABCD8" } ] } ] }, { "II": "ABCD9" } ] }
内容的提问来源于stack exchange,提问作者kzaiwo
相关产品推荐
相关产品推荐

