递归查询自关联表数据生成一维数组的代码错误排查
问题原因
你的代码存在两个核心问题:
- 递归函数
findChildren返回值类型不统一:存在子节点时返回数组,没有子节点时返回单个对象,导致后续拼接结构混乱。 - 递归返回的子级结果本身就是数组,直接展开
...resolveResponses会把整个子数组作为外层数组的元素,最终产生嵌套结构。
解决方案
统一递归函数的返回值类型为数组,同时对递归获取的子级结果做扁平化处理:
async function detail({ id }) { const findChildren = async ({ id }) => { const idea = await find({ id }); const responses = await responseIdeas({ parentIdeaId: id }); // 统一返回数组格式 if (responses.length !== 0) { const resolveResponses = await Promise.all( responses.map(async ({ id }) => findChildren({ id })) ); // 拍平递归返回的多层数组再拼接 return [idea, ...resolveResponses.flat()]; } return [idea]; }; return findChildren({ id }); }
运行验证
修改后执行run()函数,输出结果为:
[ { "id": "1", "title": "Title 1", "parentIdeaId": null }, { "id": "2", "title": "Title 2", "parentIdeaId": 1 }, { "id": "3", "title": "Title 3", "parentIdeaId": 2 } ]
完全符合预期的扁平结构要求。
内容的提问来源于stack exchange,提问作者Dominique Altrez
相关产品推荐
相关产品推荐

