9102年了,我还不会数组去重。。。

152 阅读2分钟

人生下来的时候都只有一半,为了找到另一半而在人世间行走。有的人很幸运,很快就找到了。而有人却要找一辈子。

人生下来的时候都只有一半,为了找到另一半而在人世间行走。有的人很幸运,很快就找到了。而有人却要找一辈子。

最近准备面试中,才发现数组去重都忘了。。。赶紧总结一波,顺便来掘金大半年了,一直在划水。。。萌新第一篇总结,有不对之处,欢迎指正。

1.双重for循环

将数组的前一项和后面的每一项进行比较,如果相等,删除后一项,同时数组长度(下标)也要-1

function unique(arr) {
    for(var i=0;i<arr.length;i++) {
        for(var j=i+1;j<arr.length;j++) {
            if(arr[i]==arr[j]) {
                arr.splice(j,1);
                j--;
            }
        }
    }
    return arr;
}

2.ES6的 Set 数据结构

利用ES6的 Set 数据结构拥有唯一值的特性进行数组去重,ps:我这么懒,就喜欢这样代码少的

function unique(arr){
    if(!Array.isArray(arr)){
    	throw 'type error'
      }
    	return [...new Set(arr)]
    }

3. indexOf + filter

利用 indexOf 检测元素在数组中第一次出现的位置是否和元素现在的位置相等,如果不等则说明该元素是重复元素,利用filter方法筛选出数组中的唯一项,返回排序后的数组

 Array.prototype.unique=function unique(){
     //this指当前类的实例,也就是我们要操作的数组
     	return this.filter((item,index)=>{
     		return this.indexOf(item)==index
     	})
     }
var arr1=[1,1,2,5,7,8,0,9,4,4,7,7,7,7,8,1];
console.log( arr1.unique())//(8) [1, 2, 5, 7, 8, 0, 9, 4]

4.对数组的原型方法扩展1

  1. 不改变原有数组

  2. 创建一个空对象和空数组,循环将数组每一项添加到该对象中,判断如果当前项不在该对象中,则push到空数组中,返回去重后的数组

 Array.prototype.unique=function unique(){
     var temp={},arr=[],len=this.length;
         for(let i=0;i<len;i++){
             if(!temp[this[i]]){
                 temp[this[i]]=this[i];
                 arr.push(this[i]);
             }
         }
         return arr
     }
     var arr1=[1,1,2,5,7,8,0,9,4,4,7,7,7,7,8,1];
     console.log( arr1.unique().sort());//(8) [0, 1, 2, 4, 5, 7, 8, 9]

5.对数组的原型方法扩展2

  1. 改变原有数组

  2. 创建一个空对象,循环将数组每一项添加到该对象中,利用 hasOwnProperty() 判断当前项在不在该对象中,在的话删除,不在就添加,手动释放obj占的堆内存,返回去重后的数组

Array.prototype.unique=function unique(){
     var obj={}
     for(let i=0;i<this.length;i++){
         var item=this[i]
         obj.hasOwnProperty(item)?(this.splice(i,1),i--):obj[item]=item
     }
     obj=null
     return this
 }
 var arr1=[1,1,2,5,7,8,0,9,4,4,7,7,7,7,8,1];
 console.log(arr1.unique())//(8) [1, 2, 5, 7, 8, 0, 9, 4]
 console.log(arr1)//(8) [1, 2, 5, 7, 8, 0, 9, 4]

总结

数组去重方法有很多种,孰优孰劣,还要根据具体使用场景判断,另外上述对于数组原型方法的扩展,由于返回的还是一个数组,可以链式操作,比较方便(b格高。。。)。以上就是我的首发了,紧张兮兮。。。