js陣列去重的4個方法

2021-07-24 23:52:35 字數 908 閱讀 6907

我總共想出了三種演算法來實現這個目的:

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()

} return re;

}

這個方法的思路是先把陣列排序,然後比較相鄰的兩個值。 排序的時候用的js原生的sort方法,js引擎內部應該是用的快速排序吧。 最終測試的結果是此方法執行時間平均是第二種方法的三倍左右,不過比第一種和第三種方法快了不少。

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...