1.indexOf

  1. function unique(arr) {
  2. let ret = []
  3. let current
  4. for(let i = 0;i<arr.length;i++) {
  5. current = arr[i]
  6. if(ret.indexOf(current) === -1) {
  7. ret.push(current)
  8. }
  9. }
  10. return ret
  11. }

2.排序后去重

  1. function unique(arr) {
  2. let ret = []
  3. let sortedArr = arr.concat().sort()
  4. let previous
  5. for(let i = 0;i<sortedArr.length;i++) {
  6. if(!i || sortedArr[i] !== previous ) {
  7. ret.push(sortedArr[i])
  8. }
  9. previous = sortedArr[i]
  10. }
  11. return ret
  12. }

3.合并indexOf和排序

  1. function uniqueAPI(arr,isSorted) {
  2. let ret = []
  3. let previous
  4. for(let i = 0;i<arr.length;i++) {
  5. if(isSorted) {
  6. if(!i || arr[i] !== previous) {
  7. ret.push(arr[i])
  8. }
  9. previous = arr[i]
  10. }else {
  11. if(ret.indexOf(arr[i]) === -1) {
  12. ret.push(arr[i])
  13. }
  14. }
  15. }
  16. return ret
  17. }

4.filter

4.1 indexOf简化外层循环

  1. function unique(arr) {
  2. arr.filter((item,index,arr) => {
  3. return item.indexOf(arr) === index
  4. })
  5. }

4.2 sort简化外层循环

  1. function unique(arr) {
  2. arr.concat().sort().filter((item,index,arr) => {
  3. return !index || item !== arr[index-1]
  4. })
  5. }

4.3 对象键值对

  1. function unique(arr) {
  2. let obj = {}
  3. arr.filter((item,index,arr) => {
  4. obj.hasOwnProperty(typeof item + item)? false: (obj[typeof item + item] = true)
  5. })
  6. }

5.ES6

5.1 Set

  1. let unique = arr => [...new Set(arr)]

5.2 Map

  1. function unique(arr) {
  2. let map = new Map()
  3. arr.filter(item => !map.has(item) && map.set(item,1) )
  4. }