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) )}