模擬了以下兩個陣列,乙個陣列長度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...