我總共想出了三種演算法來實現這個目的:
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陣列去重的4個方法
我總共想出了三種演算法來實現這個目的 array.prototype.unique1 function return n array.prototype.unique2 function r n為hash表,r為臨時陣列 for var i 0 i this.length i 遍歷當前陣列 retu...
js陣列去重的4個方法
我總共想出了三種演算法來實現這個目的 方法1.array.prototype.unique1 function return n 方法2.array.prototype.unique2 function r n為hash表,r為臨時陣列 for var i 0 i this.length i 遍歷當...
js陣列去重方法
var arr 1,2,3,4,5,1,2,3 function norepeat arr console.log norepeat arr 結果 1,2,3,4,5 arr.indexof val 這個方法會獲取val所在arr的下標 返回為 true 說明 獲取下標後和index下標對比如果 i...