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
相关产品推荐
相关产品推荐

