• 数组去重方法总结


    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 ]
    

    参考:

  • 相关阅读:
    EKLM3S8962之LED
    [uClinuxdev] detecting stack overflow
    Eclipse换行符
    EKLM3S8962之OLED
    Windows 环境下 GNU ARM 开发环境建立
    关于阻焊层和助焊层的理解
    MISRA C 2004中文版
    对话框托盘程序实现源码
    VC++中四种进程或线程同步互斥的控制方法
    Windows线程同步与互斥技术总结
  • 原文地址:https://www.cnblogs.com/zhangrunhao/p/7685920.html
Copyright © 2020-2023  润新知