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

JavaScript递归实现makeTree函数:将分类数组转换为嵌套树形结构

实现思路

采用自顶向下的递归生成逻辑:

  • 每次递归先找到所有归属当前parent的子分类
  • 对每个子分类,再次递归生成它下属的子树结构
  • 最终把所有子树挂载到当前层级的节点对象上返回
正确实现代码
const makeTree = (categories, parent = null) => {
  const currentNode = {}
  // 筛选出当前parent对应的所有直接子分类
  const childCates = categories.filter(item => item.parent === parent)
  // 遍历子分类,递归生成子分类的下属树
  childCates.forEach(cate => {
    currentNode[cate.id] = makeTree(categories, cate.id)
  })
  return currentNode
}
代码说明
  1. 给第二个参数parent设置默认值null,符合不传parent时默认查询根节点的要求
  2. 每次递归都初始化一个空对象currentNode,用来存储当前层级的所有分类节点
  3. 用filter筛选所有父级ID等于当前传入parent的分类,作为当前层级的直接子节点
  4. 遍历每个子分类,将递归调用生成的子树赋值给当前节点对应的ID属性
  5. 没有子分类时filter返回空数组,直接返回空对象,符合叶子节点的格式要求
  6. 全程不修改原分类数组,无副作用
原有代码的问题
  • 只操作根层级的对象,没有递归查找父节点所在的嵌套层级,导致深层子节点无法挂载到对应位置
  • Object.assign用法错误,无法实现子节点挂载的需求
  • 使用shift修改原数组,会产生副作用,影响原数组的后续使用

内容的提问来源于stack exchange,提问作者Mikel Fisher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:45:10