方法一:
定義一個(gè)結(jié)果數(shù)組rs他嫡,遍歷原數(shù)組arr枉长,并與結(jié)果數(shù)組比較:若在結(jié)果數(shù)組rs中不存在,則加入當(dāng)前元素到結(jié)果數(shù)組裆蒸,并繼續(xù)遍歷arr下一個(gè)元素熔萧;若存在,則直接遍歷下一個(gè)元素僚祷。
第一個(gè)元素直接添加到結(jié)果數(shù)組佛致,繼續(xù)遍歷第二個(gè):
第二個(gè)元素2在rs中不存在,則加入rs數(shù)組辙谜,并繼續(xù)遍歷下一個(gè):
第三個(gè)元素1在rs中存在俺榆,則直接遍歷下一個(gè),下一個(gè)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)行排序蜕乡,然后遍歷判斷相鄰兩個(gè)元素是否相等,若相等直接刪除后一個(gè)元素梗夸,下一個(gè)元素繼續(xù)與當(dāng)前元素進(jìn)行比較:
遍歷第一個(gè)元素1层玲,與下一個(gè)元素比較,兩個(gè)相等反症,則刪除第二個(gè)元素:
繼續(xù)進(jìn)行比較:
兩個(gè)元素不同辛块,則保留第二個(gè)元素,然后主元素為第二個(gè)元素2铅碍,繼續(xù)比較下一個(gè):
兩個(gè)元素不同润绵,則保留,繼續(xù)遍歷與比較:
兩個(gè)相等胞谈,則刪除后一個(gè)相等元素:
刪除后的數(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-- // 下個(gè)循環(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)行快速查詢元素的存在烦绳,首定義一個(gè)空對象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對象中新加了一個(gè)方法from()涩僻, 可以將類數(shù)組元素轉(zhuǎn)化成數(shù)組邢隧,利用這兩個(gè)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]
這是四個(gè)去重方法的實(shí)現(xiàn)模她,當(dāng)然如果環(huán)境允許,優(yōu)選第四種言沐,次選第三種蚓再。