You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:30:59