js数组去重方法 总结

方法一:双层for循环法

思路:
(1)先构建一个reArr数组用来存在结果
(2)再for()循环原数组 与 reArr数组(也要加个循环)中的元素进行比较。
(3)比较后如果不相等,则放入reArr数组;反之,不放入。
缺点:很明显,效率太低。

Array.prototype.unique = function(){
    if(this.length < 1){return this;}
    var reArr = [this[0]];   
    for(var i = 1;i < this.length;i++){ 
        var myswitch = true;    
        for(var j = 0;j < reArr.length;j++){
            if(reArr[j] === this[i]){
                myswitch = false;
                break;        
            }                     
        }
        if(myswitch){
            reArr.push(this[i]);
        }
    }   
    return reArr;
};
var arr = ["aa","dad","aa","dad","1",1,2,3,2];
console.log(arr.unique());//["aa", "dad", "1", 1, 2, 3]

方法二:折半去重

思路:
(1)先将原数组进行排序,再创建reArr数组
(2)将原数组第i个元素 与 reArr数组的最后一个元素进行比较(因为已经排序,所以重复元素会在相邻位置)

优点:比上面第一种方法效率高。
缺点:因为在去重前进行了排序,所以最后返回的去重结果也是排序后的。如果要求不改变数组的顺序去重,那这种方法便不可取。

Array.prototype.unique = function(){
    if(this.length < 1){return this;}
    this.sort();
    var reArr = [this[0]];   
    for(var i = 1;i < this.length;i++){
        if(this[i] !== reArr[reArr.length - 1]){
            reArr.push(this[i]);
        }
    }
    return reArr;
};
var arr = ["aa","dad","aa","dad","1",1,2,3,2];
console.log(arr.unique());//["1", 1, 2, 3, "aa", "dad"]

方法三:利用对象的属性不同的特点 进行去重

思路:
(1)创建一个reArr数组存放结果
(2)创建一个空对象obj
(3)再将原数组进行for循环,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到reArr数组中,同时把这个元素的内容作为对象obj的一个属性,并赋值为1。
说明:每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复。

优点:效率比上面方法都高。
缺点:在去重时不能判断数据类型,eg:如果数组中有两个元素:1,“1“,(一个是数字,一个是字符串)去重时会去掉其一,但实际两者并不完全相等。

Array.prototype.unique = function(){
    if(this.length < 1){return this;}
    var reArr = [];
    var obj = {};
    for(var i = 0; i < this.length; i++){
      if(!obj[this[i]]){
       reArr.push(this[i]);
       obj[this[i]] = 1;
      }
    }
    return reArr;
};
var arr = ["aa","dad","aa","dad","1",1,2,3,2];
console.log(arr.unique());// ["aa", "dad", "1", 2, 3]

方法四:利用ES6的set

Set类似于数组,其成员的值都是唯一的。
利用Array.from将Set结构转换成数组

function unique(array){
 return Array.from(new Set(array));
}
var arr = ["aa","dad","aa","dad","1",1,2,3,2];
console.log(unique(arr)); //["aa", "dad", "1", 1, 2, 3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值