怎么利用JavaScript实现数组去重的多种方法?

来源:微信开发网作者:越南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《怎么利用JavaScript实现数组去重的多种方法?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《怎么利用JavaScript实现数组去重的多种方法?》有用,将其分享出去将是对创作者最好的鼓励。

在JavaScript开发过程中,我们经常会遇到需要处理数组重复元素的情况,比如从接口获取的数据存在重复项、用户多次选择相同内容等场景,都需要对数组进行去重操作。不同的去重方法有着不同的实现逻辑和适用场景,下面我们就来逐一介绍常见的数组去重实现方式。

怎么利用JavaScript实现数组去重的多种方法?

基于Set的去重方法

Set是ES6引入的新数据结构,它的最大特点就是成员的值都是唯一的,没有重复的值,利用这个特性可以非常快速地实现数组去重。

实现代码如下:

// 使用Set实现数组去重
function uniqueBySet(arr) {
    // 将数组转换为Set,自动去除重复元素,再转回数组
    return [...new Set(arr)];
}

// 测试示例
const testArr1 = [1, 2, 2, 3, 4, 4, 5];
console.log(uniqueBySet(testArr1)); // 输出 [1, 2, 3, 4, 5]

这种方法的优点是代码简洁,执行效率很高,但是需要注意Set是ES6新增的特性,如果项目需要兼容IE等不支持ES6的环境,就不能使用这种方式。

基于indexOf的去重方法

indexOf方法可以返回某个元素在数组中首次出现的位置,利用这个特性可以判断当前元素是否是第一次出现,从而实现去重。

实现代码如下:

// 使用indexOf实现数组去重
function uniqueByIndexOf(arr) {
    const result = [];
    for (let i = 0; i < arr.length; i++) {
        // 判断当前元素是否在结果数组中存在
        if (result.indexOf(arr[i]) === -1) {
            result.push(arr[i]);
        }
    }
    return result;
}

// 测试示例
const testArr2 = ['a', 'b', 'b', 'c', 'a'];
console.log(uniqueByIndexOf(testArr2)); // 输出 ['a', 'b', 'c']

这种方法的兼容性比较好,支持ES5及以上的环境,但是indexOf方法在数组较大时性能会有所下降,因为每次判断都需要遍历结果数组。

基于filter的去重方法

filter方法可以过滤数组中的元素,结合indexOf方法可以找到元素第一次出现的位置,从而过滤掉重复的元素。

实现代码如下:

// 使用filter实现数组去重
function uniqueByFilter(arr) {
    return arr.filter((item, index) => {
        // 判断当前元素的索引是否是第一次出现的索引
        return arr.indexOf(item) === index;
    });
}

// 测试示例
const testArr3 = [10, 20, 20, 30, 10, 40];
console.log(uniqueByFilter(testArr3)); // 输出 [10, 20, 30, 40]

这种方法的代码也比较简洁,同样存在indexOf性能的问题,而且如果数组中有undefined元素,这种方法也可以正常处理。

基于reduce的去重方法

reduce方法可以对数组中的每个元素执行回调函数,逐步累积结果,利用这个特性也可以实现数组去重。

实现代码如下:

// 使用reduce实现数组去重
function uniqueByReduce(arr) {
    return arr.reduce((prev, cur) => {
        // 判断累积数组中是否包含当前元素
        if (!prev.includes(cur)) {
            prev.push(cur);
        }
        return prev;
    }, []);
}

// 测试示例
const testArr4 = [true, false, true, false, true];
console.log(uniqueByReduce(testArr4)); // 输出 [true, false]

这种方法的逻辑比较清晰,includes方法是ES6新增的,如果需要兼容旧环境,可以把includes替换成indexOf判断。

基于双重循环的去重方法

双重循环是比较原始的去重方式,外层循环遍历原数组,内层循环遍历结果数组,判断是否存在重复元素。

实现代码如下:

// 使用双重循环实现数组去重
function uniqueByLoop(arr) {
    const result = [];
    for (let i = 0; i < arr.length; i++) {
        let isRepeat = false;
        for (let j = 0; j < result.length; j++) {
            if (arr[i] === result[j]) {
                isRepeat = true;
                break;
            }
        }
        if (!isRepeat) {
            result.push(arr[i]);
        }
    }
    return result;
}

// 测试示例
const testArr5 = [1, '1', 2, 2, '2'];
console.log(uniqueByLoop(testArr5)); // 输出 [1, '1', 2, '2']

这种方法的兼容性最好,几乎所有环境都支持,但是性能相对较差,因为嵌套循环的时间复杂度是O(n²),数组较大时执行速度会明显变慢。

不同去重方法的对比

我们可以通过下面的表格来对比不同去重方法的特点:

去重方法兼容性性能代码简洁度
Set方法ES6及以上
indexOf方法ES5及以上中等中等
filter方法ES5及以上中等
reduce方法ES5及以上(includes需ES6)中等中等
双重循环方法全环境支持

在实际开发中,我们可以根据项目的兼容性要求、数组的大小和代码的简洁性需求来选择合适的去重方法。如果不需要兼容旧环境,优先选择Set方法,代码简洁且性能优秀;如果需要兼容旧环境,数组较小时可以选择indexOf或者filter方法,数组较大时可以考虑优化后的循环方式。

JavaScript数组去重Setfilterreduce修改时间:2026-07-19 22:54:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。