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

求助:如何将路径数组转换为唯一路径数组?递归实现指导

解决路径数组转唯一完整路径链的问题

我来帮你搞定这个递归实现的问题!你的需求是把这些零散的路径节点串联成完整的唯一路径链,对吧?先看一下完整的实现代码,然后我会一步步解释关键部分:

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);

关键部分解释:

  1. 路径映射与起始节点定位:

    • 用pathMap把每个起点(out)对应的所有路径存起来,这样递归时能快速找到后续节点。
    • 用allDestinations收集所有终点(in),筛选出没有被任何终点指向的起点,这些就是每条完整链的起始点。
  2. 递归函数buildChain:

    • 终止条件:当当前节点没有后续路径时,返回当前已构建的链。
    • 递归逻辑:遍历当前节点的所有后续路径,把路径加入当前链,然后把路径的终点转换成下一个起点的格式(替换|i|xxx为|o|0),继续递归构建子链。用flatMap把多个递归返回的数组合并成一个一维数组,方便后续处理。
  3. 去重处理:

    • 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:54:10