Express.js中生成嵌套分类的递归函数不返回值,children为空如何解决?
问题原因
你的代码问题出在ObjectId类型和字符串的全等比较不匹配:
- Mongoose查询返回的分类
_id是ObjectId类型的对象,而数据库中存储的parentId是字符串格式,直接用===比较会因为类型不同返回false,导致匹配不到对应父分类的子分类。 - 根分类的判断条件也可以优化得更兼容。
修复方案
修改createCategory递归函数,将比较的字段统一转为字符串后再判断:
const createCategory = (categories, parentId = null) => { const categoryList = [] let category if (parentId === null) { // 兼容parentId为undefined、null两种根分类情况 category = categories.filter(cat => !cat.parentId); } else { // 统一转为字符串后再比较 category = categories.filter(cat => String(cat.parentId) === String(parentId)) } category.forEach((cate) => { categoryList.push({ _id: cate._id, name: cate.name, slug: cate.slug, children: createCategory(categories, cate._id) }) }) return categoryList }
效果验证
修改后再次请求接口,Mobile分类下会正确返回Oppo、Samsung、Nokia、Nokia 2.4四个子分类。如果需要实现三级分类(比如把Nokia 2.4归为Nokia的子分类),只需要把对应数据的parentId改为Nokia分类的id即可。
内容的提问来源于stack exchange,提问作者Shohel Mia
相关产品推荐
相关产品推荐

