数组去重失效:排除重复元素后数组仍存在重复项
问题分析与解决方案
核心错误点
你的代码存在两个关键问题:
- map函数误用:map的作用是转换数组元素,返回与原数组长度一致的新数组,它不适合用来做去重或过滤操作。
- 判断逻辑失效:在map回调里判断
resultArray.includes(tag)时,resultArray还没被map的结果赋值,始终是初始空数组,导致每次判断都是false,所有tag都会被返回,自然保留了重复项。
正确写法
写法一:forEach遍历手动去重
const getUniqueTags = async (req,res)=>{ const allRecipes = await Recipe.find({}).select("tag"); let resultArray =[]; allRecipes.forEach(recipe => { const tag = recipe.tag; if(!resultArray.includes(tag)){ resultArray.push(tag); } }); console.log(resultArray); res.status(200).json(resultArray) }
写法二:Set快速去重(解决你之前Set无效的问题)
你之前用Set没生效,大概率是没先把所有tag提取成数组再处理,正确用法如下:
const getUniqueTags = async (req,res)=>{ const allRecipes = await Recipe.find({}).select("tag"); // 先提取所有tag到数组 const allTags = allRecipes.map(recipe => recipe.tag); // 用Set去重后转回数组 const resultArray = [...new Set(allTags)]; console.log(resultArray); res.status(200).json(resultArray) }
额外优化:数据库层面直接去重(更高效)
如果数据量较大,建议直接通过MongoDB的distinct方法在数据库端完成去重,减少内存消耗:
const getUniqueTags = async (req,res)=>{ const resultArray = await Recipe.distinct("tag"); console.log(resultArray); res.status(200).json(resultArray) }
distinct会直接返回指定字段的所有唯一值,是最简洁高效的方式。
内容的提问来源于stack exchange,提问作者IHateCoding
相关产品推荐
相关产品推荐

