JS-数组去重

本文探讨了JavaScript中数组去重的多种常见方法,包括双for循环、对象映射、indexOf和ES6 Set,同时指出各自优缺点,并特别关注了性能问题,如splice导致的索引调整和低版本浏览器兼容性。
摘要由CSDN通过智能技术生成

JS-数组去重


数组去重

一、双for循环方式

let arr = [1,2,3,4,5,4,2,7,3,7,1];

//1、双for循环方式
for(let i = 0;i<arr.length;i++){
    for(let j = i+1;j<arr.length;j++){
        if(arr[i] === arr[j]){
            //将随后一项放到j的位置,然后把最后一项删除
            //这样不会导致索引前置,可提高性能
            arr[j] = arr[arr.length-1];
            arr.pop();
            // arr.length--
            j--;
        }
    }
}
console.log(arr);

splice引起的数组塌陷问题

在删除重复项后,后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位),这样会大大的消耗性能。
解决:我们用最后一项替换删除项,再删除最后一项(下一轮循环还要从当前项开始),这样就不会导致索引前置,从而达到优化性能的目的。

二、对象键值对的方式

let obj = {};
for(let i = 0;i<arr.length;i++){
    if(obj[arr[i]]!==undefined){
        arr[i] = arr[arr.length-1];
        arr.pop();
        i--
    }else{
        obj[arr[i]] = arr[i];
    }
}
console.log(arr);

优点:

只有一个循环,所以性能很好

缺点:

1.如果数组中出现对象则会存在问题,因为对象的属性名不能是对象,遇到会转换为字符串;
2.如果数组中存在数字10和字符串'10',则也会认为是重复的,因为对象中的属性名是数字和字符串没有区别的;
3.数组中的值如果是undefined可能也会出现问题....

三、indexOf

let newArr = [];
arr.forEach((item,index,arrt)=>{
    if(newArr.indexOf(item) === -1){
        newArr.push(item);
    }
})
console.log(newArr);

缺点

indexOf低版本浏览器不兼容

四、ES6新特性:Set方式

Set数据结构会自动去重
let newArr = Array.from(new Set(arr));
let newArr = [...new Set(arr)];
console.log(newArr);

缺点

低版本浏览器不兼容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值