求助:如何将路径数组转换为唯一路径数组?递归实现指导
解决路径数组转唯一完整路径链的问题
我来帮你搞定这个递归实现的问题!你的需求是把这些零散的路径节点串联成完整的唯一路径链,对吧?先看一下完整的实现代码,然后我会一步步解释关键部分:
var paths = [ { out: "KFvEbaKPDC|o|0", in: "M7gtymFAo4|i|0" }, { out: "KFvEbaKPDC|o|0", in: "53s1L4YLpo|i|0" }, { out: "M7gtymFAo4|o|0", in: "DEa78KAyDf|i|0" }, { out: "53s1L4YLpo|o|0", in: "R6hUSNn5T5|i|0" } ]; function chainPaths(paths) { // 1. 构建路径映射表,快速查找每个起点对应的所有后续路径 const pathMap = new Map(); // 收集所有路径的终点,用来定位整个链的起始节点 const allDestinations = new Set(); paths.forEach(path => { if (!pathMap.has(path.out)) { pathMap.set(path.out, []); } pathMap.get(path.out).push(path); allDestinations.add(path.in); }); // 2. 找出所有链的起始节点:没有被任何路径指向的起点(out不在allDestinations中) const startNodes = [...new Set(paths.map(p => p.out))].filter(node => !allDestinations.has(node)); // 3. 核心递归函数:从当前节点出发,递归构建完整路径链 function buildChain(currentNode, currentChain) { // 获取当前节点的所有后续路径 const nextPaths = pathMap.get(currentNode) || []; // 递归终止条件:如果没有后续路径,当前链就是完整的 if (nextPaths.length === 0) { return [currentChain]; } // 遍历所有后续路径,递归构建子链,并用flatMap扁平化结果数组 return nextPaths.flatMap(path => { // 把当前路径加入到链中 const updatedChain = [...currentChain, path]; // 注意:需要把当前路径的终点(in格式)转换成下一个路径的起点格式(out格式) const nextStartNode = path.in.replace(/\|i\|.*$/, '|o|0'); // 递归调用,继续构建后续链 return buildChain(nextStartNode, updatedChain); }); } // 4. 生成所有完整路径链,并去重 const allChains = startNodes.flatMap(start => buildChain(start, [])); // 通过JSON.stringify去重,确保路径链唯一 const uniqueChains = Array.from(new Set(allChains.map(chain => JSON.stringify(chain)))).map(str => JSON.parse(str)); return uniqueChains; } // 测试运行 const result = chainPaths(paths); console.log(result);
关键部分解释:
路径映射与起始节点定位:
- 用
pathMap把每个起点(out)对应的所有路径存起来,这样递归时能快速找到后续节点。 - 用
allDestinations收集所有终点(in),筛选出没有被任何终点指向的起点,这些就是每条完整链的起始点。
- 用
递归函数
buildChain:- 终止条件:当当前节点没有后续路径时,返回当前已构建的链。
- 递归逻辑:遍历当前节点的所有后续路径,把路径加入当前链,然后把路径的终点转换成下一个起点的格式(替换
|i|xxx为|o|0),继续递归构建子链。用flatMap把多个递归返回的数组合并成一个一维数组,方便后续处理。
去重处理:
- 用
JSON.stringify把每条链转换成字符串,存入Set自动去重,再转成数组并解析回对象,确保最终得到的是唯一的路径链。
- 用
运行这段代码后,你会得到两条完整的唯一路径链,正好对应你的输入数据:
- 第一条:
KFvEbaKPDC|o|0→M7gtymFAo4|i|0→M7gtymFAo4|o|0→DEa78KAyDf|i|0 - 第二条:
KFvEbaKPDC|o|0→53s1L4YLpo|i|0→53s1L4YLpo|o|0→R6hUSNn5T5|i|0
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

