面试题:数组去重?

对象去重法

> 1. 对象第一种去重方法(使用splice会导致后面的索引向前进一位,如果后面有很多项,消耗性能很大)
var ary = [1, 2, 2, 2, 3, 2, 1, 2, 3, 2, 2, 3, 4, 3, 2, 2, 3];
//利用对象键值对去重,然后把数组中的每一项分别得到,然后把数组中的每一项,作为对象的属性名和属性值存起来
var obj = {};
//第一次得到的是1  然后把这个1作为对象的属性名和属性值存起来
//第一次{1:1}
//第二次{1:1,2:2}
//第三次{1:1,2:2,2:2}第三次的时候属性名字和第二次获取的重复了,然后每一次往里面存的时候都要判断一下之前放到对象里面的属性名和现在要放到对象里面的属性是否存在?如果存在我们就不再存储,并把当前重复项删除;如果对象中不存在当前的属性名,我们就把当前项作为键值对存储到对象中去
for (var i = 0; i < ary.length; i++) {
    var cur = ary[i];//cur是当前遍历的对象
    if (typeof obj[cur] !== 'undefined') {
        //对象中已经存在该属性:证明当前项是数组中的重复项,然后删除重复项
        ary.splice(i,1);//删除一项导致数组塌陷,为了处理这个问题要进行i--;使用splice会导致后面的索引向前进一位,如果后面有很多项,消耗性能很大
        i--;
        continue;//如果存在一样的属性名,当前项就不往对象里面加当前项作为的键值对
    }
    //我要把cur这项作为对象的属性名,属性值存起来
    obj[cur] = cur;//就相当于obj[1]=1 对象里面放1作为属性名和属性值的键值对{1:1}
}
console.log(ary);
复制代码
> 2. 对象的第二种去重方法
 var ary=[1,2,2,2,4,4,4,3,3,3,1,1,1];
    var obj={};
    for(var i=0;i<ary.length;i++){
        var cur=ary[i];
        if(typeof obj[cur]!==undefined){
            //ary.splice(i,1);//使用splice会导致后面的索引向前进一位,如果后面有很多项
            //思路我们把最后一项拿过来替换当前要删除的这一项,然后再把最后一项删除
            ary[i]=ary[ary.length-1];//用数组的最后一项替换当前项,就不会出现数组塌陷的问题了
            ary.length--;//再把最后一项删掉
            i--;
        }
    }
复制代码
> 3. 对象去重第三种面试中常用的方法,性能比较高的方法
//Array在数组内置类的原型上拓展一个方法教myUnique
//去重并排序
Array.prototype.myUnique=function myUnique() {
var obj={};
for(var i=0;i<this.length;i++){//this就是我们要操作的ary的长度
    var item=this[i];//存当前项
    if(typeof obj[item]!=='undefined'){
        this[i]=this[this.length-1];//用最后一项替换当前项
        this.length--;
        i--;//需要把当前轮儿再比较一次
       continue;
    }
    obj[item]=item;//把当前项作为obj里面的属性名和属性值进行存储,判断之前要判断对象之前是否存在该属性名,如果存在该属性名,要删除重复这项
      }
   obj=null;//obj只是临时存储,要清空obj
   return this;//最后把1去重后的数组返回
};
//var ary=[1,2,2,2,3,2,1,2,3,2,2,3,4,3,2,2,3];
var ary=[12,23,13,23,12,12,12,13,23,2,31,14];
console.log(ary.myUnique().sort(function (a,b) {//链式写法
    return a-b;//从小到大去重
}));//去重
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值