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 }
代码说明
- 给第二个参数
parent设置默认值null,符合不传parent时默认查询根节点的要求 - 每次递归都初始化一个空对象
currentNode,用来存储当前层级的所有分类节点 - 用
filter筛选所有父级ID等于当前传入parent的分类,作为当前层级的直接子节点 - 遍历每个子分类,将递归调用生成的子树赋值给当前节点对应的ID属性
- 没有子分类时
filter返回空数组,直接返回空对象,符合叶子节点的格式要求 - 全程不修改原分类数组,无副作用
原有代码的问题
- 只操作根层级的对象,没有递归查找父节点所在的嵌套层级,导致深层子节点无法挂载到对应位置
Object.assign用法错误,无法实现子节点挂载的需求- 使用
shift修改原数组,会产生副作用,影响原数组的后续使用
内容的提问来源于stack exchange,提问作者Mikel Fisher
相关产品推荐
相关产品推荐

