如何通过递归从featureList生成含父级链结构的newArray数组?
最优递归实现方案
首先咱们明确核心需求:从指定ID的节点出发,向上递归遍历父节点链,最终把路径上的节点名称按「根节点 → 当前节点」的顺序存入数组。要做到最优,关键是先优化节点查找效率,再用递归清晰实现路径收集。
第一步:预处理节点映射(优化查找效率)
直接在递归里遍历数组找父节点的话,每次查找都是O(n),效率很低。咱们先把featureList转换成一个以id为键的映射对象,这样后续查找任意节点都是O(1)时间,这是实现最优方案的基础。
假设你的featureList结构是这样的:
interface Feature { id: number; parentId: number | null; // 根节点的parentId可设为null或0 name: string; } const featureList: Feature[] = [ { id: 1, parentId: null, name: 'MotherBoard' }, { id: 2, parentId: 1, name: 'Antenna' }, { id: 5, parentId: 2, name: 'Receiver' }, // 其他节点... ];
预处理代码:
// 把featureList转成id到节点的映射 const featureMap = new Map<number, Feature>(); featureList.forEach(feature => featureMap.set(feature.id, feature));
第二步:实现递归函数
递归逻辑非常贴合业务场景:
- 传入目标
id,先从映射中取出对应节点 - 如果节点不存在,返回空数组(边界容错)
- 如果是根节点(parentId为null/0),直接返回仅包含当前节点名称的数组
- 否则,先递归获取父节点的路径数组,再把当前节点名称追加到数组末尾
代码实现:
function buildPath(targetId: number): string[] { const feature = featureMap.get(targetId); // 边界处理:找不到节点直接返回空数组 if (!feature) return []; // 根节点直接返回自身名称数组 if (!feature.parentId) { return [feature.name]; } // 递归获取父节点路径,再拼接当前节点名称 const parentPath = buildPath(feature.parentId); return [...parentPath, feature.name]; }
第三步:调用示例
比如你要获取ID为5的节点路径:
const newArray = buildPath(5); console.log(newArray); // 输出: ['MotherBoard', 'Antenna', 'Receiver']
为什么这是最优方案?
- 时间效率:预处理是O(n),每次路径构建是O(d)(d为路径长度,即递归深度),整体复杂度远低于每次遍历数组的O(n*d)
- 代码可读性:递归逻辑完全贴合“向上找父节点”的业务逻辑,比循环实现更直观
- 可复用性:
buildPath函数可以独立调用,不需要每次都遍历整个featureList
你原有代码可能存在的问题
从你给出的代码片段来看,你可能在循环里处理单个节点时,没有正确递归收集父节点链,或者没做节点映射导致查找效率低,甚至可能把路径顺序搞反了(比如先加当前节点再加父节点)。用上面的方案可以完美解决这些问题。
内容的提问来源于stack exchange,提问作者jitenderd
相关产品推荐
相关产品推荐

