求助优化JavaScript递归函数:将JSON树节点转为嵌套JSON结构
优化扁平JSON转嵌套结构的递归函数
原代码的潜在问题
- 当
children数组中包含不存在于节点集合的ID时,map会生成undefined元素,导致最终的children数组存在无效项 - 直接修改克隆后的节点对象,可能产生意外的副作用
- 缺少输入合法性校验,遇到无效输入时无法给出明确错误提示
structuredClone在旧版浏览器(如IE)中不支持,兼容性有限
优化后的代码
function flattenToNested(nodes, rootId = 'root') { // 校验输入合法性 if (typeof nodes !== 'object' || nodes === null) { throw new Error('Invalid nodes input: must be a non-null object'); } const rootNode = nodes[rootId]; if (!rootNode) { throw new Error(`Root node with ID "${rootId}" does not exist`); } // 递归构建嵌套树的纯函数 const buildNestedNode = (node) => { // 浅拷贝节点,避免修改原数据 const clonedNode = { ...node }; // 处理子节点:过滤无效ID并递归构建 clonedNode.children = node.children .map(childId => nodes[childId]) .filter(Boolean) .map(buildNestedNode); return clonedNode; }; return buildNestedNode(rootNode); } // 使用示例 const sampleNodes = { root: { parent_id: 'root', current_id: 'root', children: ['node_233443'], type: 'stack' }, node_233443: { parent_id: 'root', current_id: 'node_233443', children: ['node_fdfd33', 'node_hd44d4'], type: 'column' }, node_fdfd33: { parent_id: 'node_233443', current_id: 'node_fdfd33', children: [], type: 'text' }, node_hd44d4: { parent_id: 'node_233443', current_id: 'node_hd44d4', children: [], type: 'image' }, }; const nestedTree = flattenToNested(sampleNodes); console.log(nestedTree);
优化说明
- 纯函数设计:通过对象展开语法
{ ...node }复制节点,完全避免修改原数据或中间克隆对象,保证函数无副作用 - 输入校验:添加对节点集合和根节点的合法性检查,提前抛出清晰的错误信息,便于调试
- 过滤无效子节点:使用
filter(Boolean)自动移除不存在的子节点ID对应的无效项,避免生成包含undefined的children数组 - 兼容性提升:替换
structuredClone为更兼容的对象展开语法,若需要处理包含复杂类型(如Date、RegExp)的节点,可替换为自定义深拷贝逻辑 - 通用性增强:允许传入自定义根节点ID,适配不同的根节点命名场景
- 代码可读性:拆分函数职责,外层函数处理入口校验,内层函数专注递归构建逻辑,结构更清晰
内容的提问来源于stack exchange,提问作者nosdalg
相关产品推荐
相关产品推荐

