05.18 JavaScript數組去重的幾種方法

一、數組去重的幾種方法

1、新建數組法

2、同一個數組刪除法

3、利用object/map/set去重法

4、先排序再移除法

5、Filter與indexOf法

二、數組去重代碼實現

1、新建數組法,即新建立一個數組,用來存儲結果,將原數組項逐個與新數組的成員進行比較,如果新數組中不存在就添加到新數組。時間複雜度:O(n^2)

JavaScript數組去重的幾種方法

圖1-新建數組去重法

2、同一個數組刪除法,兩個循環,將數組中的每個元素與其他未與自己比較的元素進行比較,遇到有重複時,將自己刪除,並進入下一個循環。這種方式相對效率較高,也不用新數組佔用空間。時間複雜度:O(logN)

JavaScript數組去重的幾種方法

圖2-數組刪除去重複從後往前遍歷

JavaScript數組去重的幾種方法

圖3-數組刪除去重複從前往後遍歷

注意:若是從前往後則需要對length和i進行--處理,因為數組的長度減少了。

3、利用object/map/set去重法,利用數據結構key是唯一的特性和set裡不允許重複value來去重,這種方式很討巧,但是效率也不高。時間複雜度:O(n^2)。

JavaScript數組去重的幾種方法

圖4-數組去重複Object法

JavaScript數組去重的幾種方法

JavaScript數組去重的幾種方法

圖5-數組去重複Map與Set法

4、先排序再移除法,先將數組排好序,然後從後至前或從前往後逐個與下一個進行比較,如果遇到相同時就刪除當前項,進下一個比較。時間複雜度:O(n^2)

JavaScript數組去重的幾種方法

圖6-數組去重先排序再刪除法,自後往前

JavaScript數組去重的幾種方法

圖7-數組去重先排序再刪除法,自前往後

自前往後遍歷也要注意相同的問題,即length與i要相應減少。

5、Filter結合IndexOf法,利用indexOf返回數組中第一次出現目標項下標的特點,當內容相同且下標相同表示的就是是不重複的新項,就追加到新數組中,如果查找到但下標不相說明重複了,跳出進行下一個比較。時間複雜度:O(n^2)

最簡的方式:a.filter((item, i) => i === a.indexOf(item)),這種寫法極簡,但是效率不高,不建議這麼用。具體原理實現如下:

JavaScript數組去重的幾種方法

圖8-數組去重indexOf法,continue略微優化

JavaScript數組去重的幾種方法

圖8-數組去重模擬indexOf法,break略有優化

這兩種都比極簡法好,極簡法是沒做任何優化,但因為filer與indexOf都是原生的方法,效率也還可以。

附:filter與indexOf實現源碼:

JavaScript數組去重的幾種方法

JavaScript數組去重的幾種方法

JavaScript數組去重的幾種方法


分享到:


相關文章: