陣列去重方法對比

2021-10-02 07:03:42 字數 3931 閱讀 8893

模擬了以下兩個陣列,乙個陣列長度100000 另乙個長度為50000

下面的方法都是針對這兩個陣列來做的測試

陣列長度越長 速度差異會越大

let arr1 = array.

from

(new

array

(100000),

(x, index)

=>);

let arr2 = array.

from

(new

array

(50000),

(x, index)

=>

);

//計算耗時

let start =

newdate()

.gettime()

;//開始時間

console.

log(

"雙重for迴圈 開始陣列去重");

//去重方法

function

distinct

(a,b)}}

return arr;

}console.

log(

'去重後的長度'

,distinct

(arr1, arr2)

.length)

;let end =

newdate()

.gettime()

;//結束時間

console.

log(

"結束陣列去重 耗時:"

, end - start)

;

列印結果如下

雙重for迴圈 開始陣列去重

去重後的長度 100000

結束陣列去重 耗時: 22349

兩個陣列合併之後再for迴圈巢狀 邏輯好理解 但是 耗時太久 而且會導致頁面假死狀態 無法操作其他邏輯 效能差 體驗差 不推薦此方法

function

distinct

(a,b)}}

let arr = a.

concat

(b);

//先去重在重組

return arr;

}

列印如下,

結束陣列去重 耗時: 6890
時間少很多 但是有限制,必須原陣列中沒有重複的才能用這個方法 不能完全去重 效能也是比較差 不推薦使用

直接上**

function

distinct

(a,b)

)}

列印如下

結束陣列去重 耗時: 9593
filter() 方法會建立乙個新的陣列,新陣列中的元素是通過檢查指定陣列中符合條件的所有元素。

filter() 判斷計算條件 返回的還是之前的陣列元素 filter不會改變原素組

這個方法會全部遍歷一遍 去重也比較徹底 但是耗時還是比較久

function

distinct

(a, b)})

;//newarr的長度還是兩個陣列的長度之和 只是不符合條件的值變成了undefined

return newarr.

filter

((itemx,idx)

=>);

}

執行列印如下

結束陣列去重 耗時: 9658
map() 方法返回乙個新陣列,陣列中的元素為原始陣列元素呼叫函式處理後的值。

map() 方法按照原始陣列元素順序依次處理元素。 map也不改變原陣列

但是上述**執行map之後 陣列長度還是150000 只是重複值的地方的值變成了undefined,依舊佔了陣列的位置 還需要再調一次filter去掉陣列裡面的undefined 邏輯相對比較複雜 還不如直接調一次filter的方法 耗時也比較久

function

distinct

(a,b)

}}

列印如下

結束陣列去重 耗時: 9547
includes() 方法用來判斷乙個陣列是否包含乙個指定的值,如果是返回 true,否則false。

這種方法和filter()+indexof()的邏輯是一樣的 只是將filter的內部邏輯用for迴圈顯示出來了 indexof和includes同樣都是用來條件判斷的 耗時也差不多

function

distinct

(a,b)

}return result;

}

列印耗時:

結束陣列去重 耗時: 18
驚呆了 竟然只用了18ms 比上面的快太多了 邏輯也比較簡單

array.sort() 可以傳參也可以不傳 如果沒有使用引數,將按字母順序對陣列中的元素進行排序,說得更精確點,是按照字元編碼的順序進行排序。要實現這一點,如有必要 首先應把陣列的元素都轉換成字串,然後再進行比較

排序之後就只需要比較當前元素和前乙個元素是否一樣就行了

function

distinct

(a,b)

列印耗時如下:

結束陣列去重 耗時: 17
這個方法也是非常的快,邏輯也就一兩行 非常的簡單 set是es6提供的新的資料結構

set 物件允許你儲存任何型別的唯一值,無論是原始值或者是物件引用。

根據set物件 元素的唯一性 就能直接處理陣列去重

function

distinct

(a,b)

;let result =

;for

(let i of arr)

}return result;

}

列印耗時如下:

結束陣列去重 耗時: 11
測試的幾種方法中耗時最短的,陣列長度越長 效果越明顯

首先建立乙個空物件,然後用 for 迴圈遍歷 不重複的加入物件裡面

利用物件的屬性不會重複這一特性,校驗陣列元素是否重複

前面幾種方法耗時太久不推薦,後三種耗時差不多,那究竟那種方法耗時最優呢,我們將陣列改造下

(前面幾種方法就不做陣列長度加長的測試了 會直接卡死動不了。。。。。要等很久很久。。。)

let arr1 = array.

from

(new

array

(1000000),

(x, index)

=>);

let arr2 = array.

from

(new

array

(500000),

(x, index)

=>

);

兩個陣列的長度分別*10倍,陣列長度變成100萬和50萬 然後執行後三種方法,可以得到大概這樣的列印

array.sort()+for迴圈 耗時:127

new set() 耗時: 159

for迴圈+object 耗時: 71

繼續加大陣列長度*100倍, 陣列長度變成1000萬和500萬 然後執行後三種方法,可以得到大概這樣的列印

array.sort()+for迴圈 耗時:1196

new set() 耗時: 2834

for迴圈+object 耗時: 714

千萬級的資料 處理時間也不到1s object的這個方法的確是最優的

綜上所有的方法 推薦使用最後這三種方法來實現陣列去重的目的,最推薦object的方法 速度會快很多

陣列去重方法

1 es6提供了新的資料結構set,它類似於陣列,但是成員的值是唯一的,沒有重複的值。let arr 1,2,5,2,3,4,1,2,3,5,4,1,2,3,2,1,1,1,asd 123 123 123 asd 1,true,true,false console.log new set arr 或...

陣列去重方法

雙迴圈去重 雙重 for 或 while 迴圈是比較笨拙的方法,它的實現原理很簡單 先定義乙個包含原始陣列第乙個元素的陣列,然後遍歷原始陣列,將原始陣列中的每個元素與新陣列的每個元素進行比較,如果不重複則新增到新的陣列中,最後返回新的陣列,其缺點是如果陣列長度很長,那麼將會非常消耗記憶體 funct...

陣列去重方法

1.使用原生的filter和indexof來進行過濾和篩選。var filtered data.filter function item,index 複製 使用filter的第三個引數繫結this的值 var filtered2 data.filter function item,index,sel...