数组去重方法总结

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不兼容)

  • 新建结果数组
  • 遍历目标数组, 循环过程中, 对比索引位置
  • 如果索引相等, 正面前面没相同元素, 可以添加到结果数组
  • 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 ]

参考:

posted @ 2017-10-18 11:53  张润昊  阅读(259)  评论(0编辑  收藏  举报