如何通过递归将扁平数组转换为树形结构?
如何将扁平数组递归构建为树形结构
你的递归思路方向是对的,问题出在顶级节点的匹配逻辑上:原数组里的顶级节点(id=1、4)没有dependsOn属性,它们的dependsOn值是undefined,但你的函数默认parentId为null,两者不相等,导致顶级节点被过滤掉,自然生成不了正确的树形结构。
修正后的递归实现
function buildTree(arr, parentId = null) { return arr .filter(item => { // 匹配顶级节点:没有dependsOn,或者dependsOn为null/undefined if (parentId === null) { return item.dependsOn === undefined || item.dependsOn === null; } // 匹配子节点:dependsOn严格等于父节点id return item.dependsOn === parentId; }) .map(item => ({ ...item, // 可选:移除dependsOn属性,让结构和目标一致 dependsOn: undefined, // 递归生成当前节点的子节点 children: buildTree(arr, item.id) })); }
调用示例
const result = buildTree(arr); console.log(result);
逻辑说明
- 顶级节点筛选:当
parentId为null时,找到所有没有dependsOn属性的项,作为树形结构的根节点。 - 递归生成子节点:对每个节点,递归查找数组中所有
dependsOn等于当前节点id的项,作为它的children。 - 结构对齐:可选移除
dependsOn属性,让最终结构和你给出的treeTo完全一致。
注:原目标结构中id=5的name是teste,但原数组里是dasdas,这是输入数据的小差异,不影响函数的树形转换逻辑。
内容的提问来源于stack exchange,提问作者Thiago Melo
相关产品推荐
相关产品推荐

