JavaScript数组去重的十种实现方案详解

作者:青柠时间:2026-10-25 23:52:19浏览:530

本文系统梳理了JavaScript中实现数组去重的十种常用方法。内容涵盖基于ES6特性的Set解构、includes与indexOf判断,以及利用forEach、filter、splice等原型方法的实现。同时介绍了基于对象属性标记和排序比较的传统算法,帮助开发者根据兼容性与性能需求选择最优方案。

方法1

利用 ES6 的 Set 数据结构配合解构赋值,这是目前最常用且代码最简洁的去重方式。

该方法是 ES6 规范引入后的产物,属于实现逻辑最简单的一种方案。

Set 是一种集合数据结构,用于存储不重复的值,例如 {1, 2, 3}。其核心特性在于集合内的每一个元素都是唯一的,不会存在重复值。

[...new Set(arr)] 的作用是将 Set 结构通过展开运算符解构,重新赋值为一个数组。

        function Unrepeated1(arr) {
           return [...new Set(arr)]
        }
        console.log(Unrepeated1([1,1,2,2,3,3]));
        // 结果是[1, 2, 3]

方法2

利用数组原型对象上的 lastIndexOf 方法。此方案在早期较为常用,目前逐渐被 includes 方法所取代。

核心思路:定义一个空数组用于存储结果,遍历原数组。若空数组中不存在当前元素,则将其加入;若已存在,则忽略不操作。

lastIndexOf() 方法用于返回指定值在数组中最后出现的位置,搜索方向是从后向前。若未找到该值,则返回 -1。

        function Unrepeated2(arr) {
            var res = [];
            for (var i = 0; i < arr.length; i++) {
                res.lastIndexOf(arr[i]) !== -1 ? '' : res.push(arr[i]);
            }
            return res;
        }
        console.log(Unrepeated2([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]));
        // 结果是[1, 2, 3, 5, 6, 7, 4]

方法3

利用数组原型对象上的 splice 方法进行操作。

实现思路:采用双层循环遍历数组。以第一项为例,第二层循环从第二项开始比对,若后续项与当前项相同,则执行删除操作。

splice() 方法用于删除数组元素,语法为 splice(j, 1),其中 j 代表要删除元素的索引位置,1 代表删除的数量为一个。

        function Unrepeated3(arr) {
            var i,j,len = arr.length;
            for (i = 0; i < len; i++) {
                for (j = i + 1; j < len; j++) {
                    if (arr[i] == arr[j]) {
                        arr.splice(j, 1);
                        len--;
                        j--;
                    }
                }
            }
            return arr;
        }
        console.log(Unrepeated3([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]));

方法4

利用数组原型对象上的 forEach 结合 includes 方法。includes 方法功能强大,应用广泛。

实现思路:定义一个空数组,遍历原数组,同时检查该元素是否存在于空数组中。若不存在则添加进空数组,若已存在则不再进行任何操作。

includes 方法用于判断数组是否包含指定值,返回布尔值。鉴于其易用性,它有望在未来替代 indexOf。作为 ES6 新增的 API,它不仅适用于数组,还可用于对象和字符串的判断,功能十分强大。

          function Unrepeated4(arr) {
            let newArr = [];
            arr.forEach(item => {
                return newArr.includes(item) ? '' : newArr.push(item);
            });
            return newArr;
        }
        console.log(Unrepeated4([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]));
        // 结果是[1, 2, 3, 4, 5, 6, 7]

方法5

利用数组原型对象上的 filter 结合 includes 方法。

其思路与方法4类似,区别在于将 forEach 与 includes 的组合替换为了 filter 与 includes 的组合。

        function Unrepeated5(arr) {
            var newArr = []
            newArr = arr.filter(function (item) {
                return newArr.includes(item) ? '' : newArr.push(item)
            })
            return newArr
        }
        console.log(Unrepeated5([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]));
        // 结果是[1, 2, 3, 5, 6, 7, 4]

方法6

利用数组原型对象上的 includes 方法。

此方法可作为通用解决方案,代码逻辑可进一步简化。

        function Unrepeated6(arr) {
            var newArr = []
            for (var i = 0; i < arr.length; i++) {
                if (!newArr.includes(arr[i])) {
                    newArr.push(arr[i])
                }
            }
            return newArr
        }
        console.log(Unrepeated6([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]));
        // 结果是[1, 2, 3, 5, 6, 7, 4]

方法7

利用数组的 indexOf 下标属性来进行查询判断。

其实现思路与前述方法类似。

        function Unrepeated7(arr) {
            var newArr = []
            for (var i = 0; i < arr.length; i++) {
                if (newArr.indexOf(arr[i])===-1) {
                    newArr.push(arr[i])
                }
            }
            return newArr
        }
        console.log(Unrepeated7([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]));
        // 结果是[1, 2, 3, 5, 6, 7, 4]

方法8

利用对象属性存在的特性,若目标对象中不存在该属性,则将其存入新数组。

此方法在浏览器兼容性方面表现较好。思路是使用一个空对象作为标记,通过遍历过程动态设置对象的属性,以此区分元素是否重复。

        function Unrepeated8(arr) {
            var obj={}
            var newArr=[]
            for (let i = 0; i < arr.length; i++) {
                if (!obj[arr[i]]) {
                    obj[arr[i]] = 1
                    newArr.push(arr[i])
                }   
            }
            return newArr
        }
        console.log(Unrepeated8([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]));
        // 结果是[1, 2, 3, 5, 6, 7, 4]

方法9

实现思路:首先对原数组进行排序,然后与相邻元素进行比较。若相邻元素不同,则将其存入新数组。

        function Unrepeated9(arr) {
            var formArr = arr.sort()
            var newArr=[formArr[0]]
            for (let i = 1; i < formArr.length; i++) {
                if (formArr[i]!==formArr[i-1]) {
                    newArr.push(formArr[i])
                }
            }
            return newArr
        }
        console.log(Unrepeated9([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]));
        // 结果是[1, 2, 3,  4,5, 6, 7]

方法10

实现思路:定义一个新数组,并将原数组的第一个元素放入其中。随后将原数组的其他元素逐一与新数组中的元素进行对比,若发现不同,则存入新数组。

        function Unrepeated10(arr) {
            let newArr = [arr[0]];
            for (let i = 1; i < arr.length; i++) {
                let repeat = false;
                for (let j = 0; j < newArr.length; j++) {
                    if (arr[i] === newArr[j]) {
                        repeat = true;
                        break;
                    }else{
                        
                    }
                }
                if (!repeat) {
                    newArr.push(arr[i]);
                }
            }
            return newArr;
        }
 
        console.log(Unrepeated10([1, 1, 2, 3, 5, 3, 1, 5, 6, 7, 4]));
        // 结果是[1, 2, 3, 5, 6, 7, 4]

至此,关于 JavaScript 实现数组去重的十种方法分享完毕。如需了解更多相关 JavaScript 数组去重内容,请搜索本站历史文章或继续浏览下方相关文章。期待大家今后多多支持本站!

作者最新文章