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

数组去重失效:排除重复元素后数组仍存在重复项

问题分析与解决方案

核心错误点

你的代码存在两个关键问题:

  1. map函数误用:map的作用是转换数组元素,返回与原数组长度一致的新数组,它不适合用来做去重或过滤操作。
  2. 判断逻辑失效:在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:15:04