數組去重方法總結

indexOf判斷(IE8不兼容)

  • 創建新數組, 遍歷舊數組
  • 利用index進行判斷, 是否在新數組中, 不存在push到新數組中
  • 循環結束, 返回新數組
  • 沒法去除相同NaN
function unique(arr) {
  let res = []
  for (let i = 0; i < arr.length; i++) {
    // 查看結果數組中是否含有咱們將要添加的元素
    if (res.indexOf(arr[i]) === -1) {
      res.push(arr[i])
    }
  }
  return res
}

利用對象保存

  • 新建中間對象, 新建結果數組.
  • 遍歷目標數組, 查看具體值是否爲對象的屬性名
  • 若是不是, 將值變爲對象的屬性名, 並任意賦值. 並添加到結果數組中
  • NaN處理正常
function unique(arr) {
  let obj = {},
    res = []
  for (let i = 0; i < arr.length; i++) {
    // 若是不存在這種屬性, 也就是數組中沒有這個值
    if (!obj[arr[i]]) {
      // 將這個值變爲對象的一個屬性名, 並賦值1, 進行保存
      obj[arr[i]] = 1;
      res.push(arr[i])
    }
  }
  return res
}

indexOf判斷(IE8不兼容)

  • 新建結果數組
  • 遍歷目標數組, 循環過程當中, 對比索引位置
  • 若是索引相等, 正面前面沒相同元素, 能夠添加到結果數組html

    • NaN都被清理
function unique(arr) {
  let res = []
  arr.forEach((item, index, arr) => {
    // 查看這個元素對應的索引, 是否應該爲當前索引
    // 若是沒有相同元素, 應該對應當前索引.
    // 若是前面有相同元素的話, 索引應該是在前面, 不能成功對應
    if (arr.indexOf(item) === index) {
      res.push(item)
    }
  })
  return res
}

sort排序截取

  • 將目標數組進行sort排序, 相同元素排列到一塊兒
  • 查看相同元素是否相同, 相同的話, 進行截取, 一塊兒截取到不一樣爲止.
  • 截取後, 元素須要向前-1, 以便後面的元素繼續與以前被截取相同元素 再往前的, 也就是相同的那個, 進行比較
  • 沒法去除相同NaN
function unique(arr) {
  // 排序後, 相同數據被放到一塊兒
  arr.sort()
  for (let i = 0; i < arr.length; ++i) {
    // 判斷相鄰元素是否相同
    if (arr[i] === arr[i+1]) {
      // 相同狀況下: 截取當前相同元素, 並讓索引-1, 以避免++後少比較一次
      arr.splice(i, 1)
      --i
    }
  }
}

ES6

  • 使用set數據結構去掉重複數組, 獲得對象
  • 使用Array.from將對象(類數組)轉換爲數組
  • 或者使用擴展運算符, 進行轉換數組
  • 正常處理NaN
// let arr = [1, 2, 3, 2, 3, 4, 4, 4, 5, 6, 7, 5]
let arr = ['a', 'a', null, NaN, NaN, null]

let res = new Set(arr)

console.log(res) // Set { 'a', null, NaN }

let myRes = Array.from(res)

console.log(myRes) // [ 'a', null, NaN ]
// let arr = [1, 2, 3, 2, 3, 4, 4, 4, 5, 6, 7, 5]
let arr = ['a', 'a', null, NaN, NaN, null]

let res = new Set(arr)

console.log([...res]) // [ 'a', null, NaN ]

參考:

相關文章
相關標籤/搜索