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

相關文章
相關標籤/搜索