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

JavaScript递归遍历课程JSON报TypeError问题及双向遍历实现

问题原因
  • 递归调用时错误使用this.recursiveFunc:普通函数直接调用时this不指向当前函数作用域,无法获取到recursiveFunc,直接去掉this即可。
  • 逻辑冗余错误:不需要遍历整个data的所有属性,传入的parId就是目标节点的key,直接通过data[parId]就能拿到对应节点,不需要循环判断。
  • 引用了不存在的字段preReqStages:你的JSON结构里根本没有这个属性,这个判断完全多余,会导致逻辑永远走不到正确分支。
  • 数组推入逻辑错误:直接把next/previous数组push到结果数组会生成二维数组,需要展开推入,同时还要处理递归遍历子节点,还要避免重复添加同一个ID防止死循环。
修正后的代码
function recursiveFunc(data, parId, acc, forward) {
  // 拿到当前节点要遍历的关联数组:正向取next,反向取previous
  const relatedIds = forward ? data[parId].next : data[parId].previous;
  for (const id of relatedIds) {
    // 避免重复添加ID,防止有环时死循环
    if (!acc.includes(id)) {
      acc.push(id);
      // 递归遍历当前关联ID的后续/前置节点
      recursiveFunc(data, id, acc, forward);
    }
  }
}
测试验证

用你提供的测试用例运行:

// 测试正向遍历
let nextRes = [];
recursiveFunc(courseData, 'e6e1de44-d53b-44ae-9d52-8f6e1358f8ec', nextRes, true);
console.log(nextRes); 
// 输出:['d1fc647b-ad7e-4b72-9269-5559948ee61d', 'cb00b200-cee3-4ab8-af11-abb7ea26183b', '72488692-064c-436c-93cb-8ebe2be7e168', '7b958370-d697-4536-9bff-fa564a5688ef']

// 测试反向遍历
let prevRes = [];
recursiveFunc(courseData, 'cb00b200-cee3-4ab8-af11-abb7ea26183b', prevRes, false);
console.log(prevRes);
// 输出:['d1fc647b-ad7e-4b72-9269-5559948ee61d', 'e6e1de44-d53b-44ae-9d52-8f6e1358f8ec']

完全符合预期输出要求。

内容的提问来源于stack exchange,提问作者Utsav Shrestha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:15:03