数组去重最详细的方法

本文详细介绍了使用ES6的Set特性以及早期JavaScript的各种方法实现数组去重,包括利用Set、扩展运算符、元素对比法、数组API等。这些方法分别适用于不同的场景,例如ES6之前的数组去重以及处理包含不同数据类型的复杂数组。通过实例代码展示了每种方法的实现过程,有助于理解数组去重的多种策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ES6

set方法

第一种 利用set特有的属性将其去重然后用Array.from方法将其转换为数组
  <script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        let newArr = new Set(arr)
        let result = Array.from(newArr)
        console.log(result)
    </script>
第二种 利用set特有的属性将其去重然后用【…】方法将其转换为数组
  <script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        let newArr = new Set(arr)
        let arr1 = [...newArr]
        console.log(arr1)
    </script>

ES6之前

元素对比法

每一个第一次进来的新元素会返回undefined,进入else里面赋值为1,第二次进来的元素会被删除,然后将else里面的数据push入新数组
  <script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        let content = [];
        let newArr = [];
        for (var i = 0; i < arr.length; i++) {
            if (content[arr[i]]) {
                delete content[arr[i]];
            } else {
                content[arr[i]] = 1;
                newArr.push(arr[i]);
            }
        }
        console.log(newArr);
    </script>
定义一个新数组,原数组的第一个元素放到新数组,然后将原数组一一和新数组对比,若不同则push新数组中。
 <script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        let newArr = [arr[0]];
        for (let i = 1; i < arr.length; i++) {
            let flag = false;
            for (let j = 0; j < newArr.length; j++) {
                if (arr[i] === newArr[j]) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                newArr.push(arr[i]);
            }
        }
        console.log(newArr);
    </script>
先将原数组排序,在与相邻的进行比较,如果不同则push入新数组。
 <script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        let content = arr.sort()
        let newArr = [content[0]]
        for (let i = 1; i < content.length; i++) {
            if (content[i] !== content[i - 1]) {
                newArr.push(content[i])
            }
        }
        console.log(newArr);
    </script>

利用数组api

indexOf 和 lastIndexOf 通过查询下标来判断是否相同,二者没有本质区别,一个从头开始找,一个从尾部开始找。
 <script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        let newArr = [];
        for (var i = 0; i < arr.length; i++) {
            if (newArr.indexOf(arr[i]) === -1) {
                newArr.push(arr[i])
            }
        }
        console.log(newArr);;
    </script>
 <script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        let newArr = [];
        for (var i = 0; i < arr.length; i++) {
            if (newArr.lastIndexOf(arr[i]) === -1) {
                newArr.push(arr[i])
            }
        }
        console.log(newArr);;
    </script>
includes 本身是用来判断数组是否含有某元素,返回Boolean值,但定义一个新数组然后与原数组判断则可以达到数组去重的目的。
<script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        let newArr = []
        for (var i = 0; i < arr.length; i++) {
            if (!newArr.includes(arr[i])) {
                newArr.push(arr[i])
            }
        }
        console.log(newArr);
    </script>
splice 写两个参数的话第一个参数起始位置,第二个参数是删除的个数,这里的意思如果比较的结果相同,则删掉该元素。
 <script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        for (let i = 0; i < arr.length; i++) {
            for (let j = i + 1; j < arr.length; j++) {
                if (arr[i] == arr[j]) {
                    arr.splice(j, 1);
                }
            }
        }
        console.log(arr);
    </script>

利用对象独有的方法

  <script>
        let arr = [11, 22, 33, 11, 22, 45, 69, 45, 78, 33]
        let obj = {}
        let newArr = []
        for (let i = 0; i < arr.length; i++) {
            if (!obj[arr[i]]) {
                obj[arr[i]] = 1
                newArr.push(arr[i])
            }
        }
        console.log(newArr);
    </script>

终究方法

其实上述的方法很多,但大多都有一个问题,那就是只能对数字进行去重,但是很多数组里面包含的不仅有数字,还可能有字符串,对象,等等一些奇奇怪怪的元素,那么这个时候上述的方法就不可行了,这个时候就要用到对象和数组api结合,达到使一些奇怪的数组去重。

var newArr = [true, true, false, false, undefined, undefined, null, null, obj = { a: 1}, obj = { a: 1}, ‘abcd’, ‘abcd’, ‘1’, ‘1’, 1, 1] ,假设此时有这么一个包含true,false,undefined,null,字符串,对象的数组

 <script>
        var newArr = [true, true, false, false,undefined, undefined, null, null, obj = {
            a: 1
        }, obj = {
            a: 1
        }, 'abcd', 'abcd', '1', '1', 1, 1]

        function unique(arr) {
            var obj = {}
            return arr.filter(function(item, index, array) {
                return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
            })
        }
        console.log(unique(newArr));
    </script>

输出的结果为

在这里插入图片描述

可以看到这个这个数组十分的特殊,但还是被去重成功了。这里主要是用到了fitler方法的hasOwnProperty这个方法。filter方法相信大家应该是熟悉的,这里说一下hasOwnProperty() 。官方的解释是 hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。

在这里插入图片描述

利用hasOwnProperty()方法 ,原型 + 值 的写法, 比较的不仅仅是数据类型, 还有值, 再通过对象键名不能重复的特性, 完成了深度去重。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值