方法一:
定義一個結果數組rs,遍歷原數組arr,并與結果數組比較:若在結果數組rs中不存在,則加入當前元素到結果數組,并繼續遍歷arr下一個元素;若存在,則直接遍歷下一個元素。
遍歷第一個元素1
第一個元素直接添加到結果數組,繼續遍歷第二個:
遍歷第二個元素2
第二個元素2在rs中不存在,則加入rs數組,并繼續遍歷下一個:
遍歷第三個元素1
遍歷第四個元素2
第三個元素1在rs中存在,則直接遍歷下一個,下一個2也存在于rs,則繼續遍歷,直到元素為3時,rs數組中不存在,則加入數組,然后繼續:
遍歷到元素3時
下面為實現的函數:
function unique(arr) {
var rs = [arr[0]]
for (var i = 0, arr_len = arr.length; i < arr_len; i++) {
for (var j = 0, rs_len = rs.length; j < rs_len; j++) {
if (arr[i] === rs[j]) {
j = 0
i++
}
}
if (arr[i]) rs.push(arr[i])
}
return rs
}
var arr = [1,2,1,3,4,5,3,6]
console.log(unique(arr))
結果:[1,2,3,4,5,6]
方法二:
先對數組進行排序,然后遍歷判斷相鄰兩個元素是否相等,若相等直接刪除后一個元素,下一個元素繼續與當前元素進行比較:
數組排序
遍歷第一個元素1,與下一個元素比較,兩個相等,則刪除第二個元素:
遍歷第一個元素1
刪除第二個元素
刪除后的數組
繼續進行比較:
繼續比較
兩個元素不同,則保留第二個元素,然后主元素為第二個元素2,繼續比較下一個:
比較元素2與元素3
兩個元素不同,則保留,繼續遍歷與比較:
比較元素3與下一個元素3
兩個相等,則刪除后一個相等元素:
刪除元素3
刪除后的數組:
新數組
繼續遍歷:
繼續比較
步驟方法以此類推。
實現函數:
function unique(arr) {
arr.sort()
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i + 1] && arr[i] === arr[i + 1]) {
arr.splice(i, 1) // 刪除當前
i-- // 下個循環回退當前位
}
}
return arr
}
var arr = [1, 2, 6, 1, 3, 3, 4, 5]
console.log(unique(arr))
結果:[1, 2, 3, 4, 5, 6]
方法三:
使用對象的key,value方式進行快速查詢元素的存在,首定義一個空對象obj,遍歷數組,使用元素作為key查詢obj對象中是否存在,若不重復,將元素作為對象新屬性的key并賦值為1,并將元素加入rs數組:
function unique(arr) {
var obj = {},
rs = []
arr.forEach(function (item) {
if (!obj[item]) { // 判斷對象中是否存在以當前元素作為key的屬性
obj[item] = 1 // 添加以當前元素作為key的新屬性到obj
rs.push(item) // 添加當前元素到結果數組
}
})
return rs
}
方法四
ES6中添加了Set集合,Set集合中元素特點為唯一性,無重復,并且Array對象中新加了一個方法from(), 可以將類數組元素轉化成數組,利用這兩個API可以快速進行數組去重:
function unique(arr) {
return Array.from(new Set(arr))
}
var arr = [1, 2, 6, 1, 3, 3, 4, 5]
console.log(unique(arr))
結果:[1, 2, 3, 4, 5, 6]
這是四個去重方法的實現,當然如果環境允許,優選第四種,次選第三種。