我總共想出了三種演算法來實現這個目的:
array.prototype.unique1 = function()return n;
}
array.prototype.unique2 = function(),r=; //n為hash表,r為臨時陣列
for(var i = 0; i < this.length; i++) //遍歷當前陣列 }
return r;
}
array.prototype.unique3 = function()return n;
}
其中第1種和第3種方法都用到了陣列的indexof方法。此方法的目的是尋找存入引數在陣列中第一次出現的位置。很顯然,js引擎在實現這個方法的時候會遍歷陣列直到找到目標為止。所以此函式會浪費掉很多時間。 而第2中方法用的是hash表。把已經出現過的通過下標的形式存入乙個object內。下標的引用要比用indexof搜尋陣列快的多。
為了判斷這三種方法的效率如何,我做了乙個測試程式,生成乙個10000長度的隨機數組成的陣列,然後分別用幾個方法來測試執行時間。 結果表明第二種方法遠遠快於其他兩種方法。 但是記憶體占用方面應該第二種方法比較多,因為多了乙個hash表。這就是所謂的空間換時間。 就是這個測試頁面,你也可以去看看。
2023年10月7日更新:
根據hpl大牛的思路,我寫了第四種方法:
array.prototype.unique4 = function()這個方法的思路是先把陣列排序,然後比較相鄰的兩個值。 排序的時候用的js原生的sort方法,js引擎內部應該是用的快速排序吧。 最終測試的結果是此方法執行時間平均是第二種方法的三倍左右,不過比第一種和第三種方法快了不少。} return re;
}
js陣列排序的幾種方法
sort 陣列物件排序 其原理是氣泡排序,即比較相鄰的元素,如果第乙個比第二個大,就交換他們兩個。var arr console.log arr console.log arr 0 var compare function obj1,obj2 else if val1 val2 else conso...
js 陣列去重的幾種方法
問題 隨機10個不相同的數 數值範圍11 25之間的 並且存放到陣列中 函式 隨機生成乙個從min到max的數 function randfn min,max 方法1 遍歷已存入的數和當前隨機的數比較,引入開關判斷是否存放 var arr for var i 0 i 10 i if flag con...
js陣列去重的幾種方法
js陣列去重的幾種常見方法 哎,面試的時候好多時候要做題,這也是常見題目,讓寫乙個陣列去重方法,我網上找了一些,存下來供自己學習,畢竟也不是科班出身 一 簡單的去重方法 最簡單陣列去重法 新建一新陣列,遍歷傳入陣列,值不在新陣列就push進該新陣列中 ie8以下不支援陣列的indexof方法 fun...