1.indexOf
function unique(arr) {
let ret = []
let current
for(let i = 0;i<arr.length;i++) {
current = arr[i]
if(ret.indexOf(current) === -1) {
ret.push(current)
}
}
return ret
}
2.排序后去重
function unique(arr) {
let ret = []
let sortedArr = arr.concat().sort()
let previous
for(let i = 0;i<sortedArr.length;i++) {
if(!i || sortedArr[i] !== previous ) {
ret.push(sortedArr[i])
}
previous = sortedArr[i]
}
return ret
}
3.合并indexOf和排序
function uniqueAPI(arr,isSorted) {
let ret = []
let previous
for(let i = 0;i<arr.length;i++) {
if(isSorted) {
if(!i || arr[i] !== previous) {
ret.push(arr[i])
}
previous = arr[i]
}else {
if(ret.indexOf(arr[i]) === -1) {
ret.push(arr[i])
}
}
}
return ret
}
4.filter
4.1 indexOf简化外层循环
function unique(arr) {
arr.filter((item,index,arr) => {
return item.indexOf(arr) === index
})
}
4.2 sort简化外层循环
function unique(arr) {
arr.concat().sort().filter((item,index,arr) => {
return !index || item !== arr[index-1]
})
}
4.3 对象键值对
function unique(arr) {
let obj = {}
arr.filter((item,index,arr) => {
obj.hasOwnProperty(typeof item + item)? false: (obj[typeof item + item] = true)
})
}
5.ES6
5.1 Set
let unique = arr => [...new Set(arr)]
5.2 Map
function unique(arr) {
let map = new Map()
arr.filter(item => !map.has(item) && map.set(item,1) )
}