- 利用Set去重,然后再利用from大脉,轉(zhuǎn)換成數(shù)組
const unique = (arr) => Array.from( new Set(arr) );
- 遍歷,判斷當(dāng)前項(xiàng)的下標(biāo)與在數(shù)組中第一次出現(xiàn)的下標(biāo)做比較
const unique = (arr) => {
let ret = [];
for(let i = 0, len = arr.length; i < len; i++) {
//如果當(dāng)前數(shù)組的第i項(xiàng)在當(dāng)前數(shù)組中第一次出現(xiàn)的位置不是i水孩,
//那么表示第i項(xiàng)是重復(fù)的镰矿,忽略掉。否則存入結(jié)果數(shù)組
if (arr.indexOf(arr[i]) === i) {
ret.push(arr[i]);
}
}
return ret;
}
- 利用filter俘种,返回一個(gè)新數(shù)組秤标,原理同2
const unique = (arr) => {
return Array.prototype.filter.call(arr, (item, idx) => {
return arr.indexOf(item) === idx
})
}
- 遍歷數(shù)組,通過(guò)判斷結(jié)果數(shù)組是否已經(jīng)有當(dāng)前項(xiàng)宙刘,來(lái)決定是否將當(dāng)前項(xiàng)存入結(jié)果數(shù)組中苍姜。
const unique = (arr) => {
let ret = [];
//遍歷當(dāng)前數(shù)組
for(let i = 0, len = arr.length; i < len; i++){
//如果當(dāng)前數(shù)組的第i項(xiàng)已經(jīng)保存進(jìn)了結(jié)果數(shù)組,那么跳過(guò)悬包,
//否則把當(dāng)前項(xiàng)push到結(jié)果數(shù)組里面
if (ret.indexOf(arr[i]) == -1) {
ret.push(arr[i]);
}
}
return ret;
}
- 這個(gè)思路比較獨(dú)特衙猪,是在參考鏈接中的那篇博文看到的
const unique = (arr) => {
let ret = [];
for(let i = 0, len = arr.length; i < len; i++) {
for(let j = i + 1; j < len; j++)
if (arr[i] === arr[j]) {
j = ++i;
}
ret.push(arr[i]);
}
return ret;
}
參考鏈接:
http://www.shamasis.net/2009/09/fast-algorithm-to-find-unique-items-in-javascript-array/