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

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

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

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

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. 不改变原有数组ui

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

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. 改变原有数组spa

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

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格高。。。)。以上就是个人首发了,紧张兮兮。。。code

相关文章
相关标签/搜索