方法一:
定義一個結(jié)果數(shù)組rs,遍歷原數(shù)組arr,并與結(jié)果數(shù)組比較:若在結(jié)果數(shù)組rs中不存在,則加入當(dāng)前元素到結(jié)果數(shù)組,并繼續(xù)遍歷arr下一個元素;若存在,則直接遍歷下一個元素。

第一個元素直接添加到結(jié)果數(shù)組,繼續(xù)遍歷第二個:

第二個元素2在rs中不存在,則加入rs數(shù)組,并繼續(xù)遍歷下一個:


第三個元素1在rs中存在,則直接遍歷下一個,下一個2也存在于rs,則繼續(xù)遍歷,直到元素為3時(shí),rs數(shù)組中不存在,則加入數(shù)組,然后繼續(xù):

下面為實(shí)現(xiàn)的函數(shù):
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))
結(jié)果:[1,2,3,4,5,6]
方法二:
先對數(shù)組進(jìn)行排序,然后遍歷判斷相鄰兩個元素是否相等,若相等直接刪除后一個元素,下一個元素繼續(xù)與當(dāng)前元素進(jìn)行比較:

遍歷第一個元素1,與下一個元素比較,兩個相等,則刪除第二個元素:



繼續(xù)進(jìn)行比較:

兩個元素不同,則保留第二個元素,然后主元素為第二個元素2,繼續(xù)比較下一個:

兩個元素不同,則保留,繼續(xù)遍歷與比較:

兩個相等,則刪除后一個相等元素:

刪除后的數(shù)組:

繼續(xù)遍歷:

步驟方法以此類推。
實(shí)現(xiàn)函數(shù):
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) // 刪除當(dāng)前
i-- // 下個循環(huán)回退當(dāng)前位
}
}
return arr
}
var arr = [1, 2, 6, 1, 3, 3, 4, 5]
console.log(unique(arr))
結(jié)果:[1, 2, 3, 4, 5, 6]
方法三:
使用對象的key,value方式進(jìn)行快速查詢元素的存在,首定義一個空對象obj,遍歷數(shù)組,使用元素作為key查詢obj對象中是否存在,若不重復(fù),將元素作為對象新屬性的key并賦值為1,并將元素加入rs數(shù)組:
function unique(arr) {
var obj = {},
rs = []
arr.forEach(function (item) {
if (!obj[item]) { // 判斷對象中是否存在以當(dāng)前元素作為key的屬性
obj[item] = 1 // 添加以當(dāng)前元素作為key的新屬性到obj
rs.push(item) // 添加當(dāng)前元素到結(jié)果數(shù)組
}
})
return rs
}
方法四
ES6中添加了Set集合,Set集合中元素特點(diǎn)為唯一性,無重復(fù),并且Array對象中新加了一個方法from(), 可以將類數(shù)組元素轉(zhuǎn)化成數(shù)組,利用這兩個API可以快速進(jìn)行數(shù)組去重:
function unique(arr) {
return Array.from(new Set(arr))
}
var arr = [1, 2, 6, 1, 3, 3, 4, 5]
console.log(unique(arr))
結(jié)果:[1, 2, 3, 4, 5, 6]
這是四個去重方法的實(shí)現(xiàn),當(dāng)然如果環(huán)境允許,優(yōu)選第四種,次選第三種。