zoukankan      html  css  js  c++  java
  • javascript 数组去重的方法

    前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!

    方法一

        //注意有一个元素是空的
        var test1 = [0, 0, 1, 1, 2, 'sss', 2, , 3, 'abc', 3, 4, 4, 'sss', 'apple', 5, 5, 6, 7, 8, 9, function a() {}];
        //第一种方法是遍历新数组newArr里有没有包含arr里的i项,如果没有则向newArr里添加arr[i]项,如果有则跳过
        //需考虑indexOf()的兼容性问题
        function arrayUnique1(arr) {
          var newArr = [];
          for (var i = 0; i < arr.length; i++) {
            if (newArr.indexOf(arr[i]) == -1) {
              newArr.push(arr[i]);
            }
          }
          return newArr;
        }
        console.log(arrayUnique1(test1)); //[0, 1, 2, "sss", undefined, 3, "abc", 4, "apple", 5, 6, 7, 8, 9, function]

    方法二

        var test2 = [0, 0, 1, 1, 2, 'sss', 2, , 3, 'abc', 3, 4, 4, 'sss', 'apple', 5, 5, 6, 7, 8, 9, function a() {}];
        //先将数组进行排序,重复元素会在相邻位置
        //拿原数组第i个和新数组的最后一个进行比较,如果不同,则将该元素存入新数组中
        //该方法由于使用sort()方法,所以会改变数组顺序
        function arrayUnique2(arr) {
          arr.sort();
          var newArr = [arr[0]];
          for (var i = 1; i < arr.length; i++) {
            if (arr[i] !== newArr[newArr.length - 1]) {
              newArr.push(arr[i]);
            }
          }
          return newArr;
        }
        console.log(arrayUnique2(test2)); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "abc", "apple", function, "sss", undefined]

    方法三

        var test3 = [0, 0, 1, 1, 2, 'sss', 2, , 3, 'abc', 3, 4, 4, 'sss', 'apple', 5, 5, 6, 7, 8, 9, function a() {}];
        //不太熟悉hash表,大概意思如下:
        //遍历原数组,每次从原数组取出一个元素,然后到新对象中去访问这个属性,如果不能访问到值,则把它存放到新数组中,同时把这个元素作为一个属性,并赋值为true,存入到新建立的对象中。如果能访问到值,则说明重复;
    
        //访问对象的属性有两种方式   obj['attr']  或者   obj.attr;
        //当知道具体属性名时可以用obj.attr,如arr.length;当不确定属性名时,就要用obj['attr'];
        //这两种方法区别上不大,都有对应的使用场景。点表示法一般作为静态对象使用时来存取属性。而数组表示法在动态存取属性时就非常有用。
        function arrayUnique3(arr) {
          var newArr = [],
            hash = {};
          for (var i = 0; i < arr.length; i++) {
            if (!hash[arr[i]]) {
              hash[arr[i]] = true;
              newArr.push(arr[i]);
            }
          }
          return newArr;
        }
        console.log(arrayUnique3(test3)); //[0, 1, 2, "sss", undefined, 3, "abc", 4, "apple", 5, 6, 7, 8, 9, function]

    方法四

      const arr = [];
      // 生成[0, 100000]之间的随机数
      for (let i = 0; i < 100000; i++) {
        arr.push(0 + Math.floor((100000 - 0 + 1) * Math.random()))
      }
      // ...实现算法
      console.time('test');
      let a = [...new Set(arr)].sort((a, b) => a - b)
      console.log(a)
      console.timeEnd('test');
      console.log(arr.sort((a, b) => a - b))

    方法五

      const arr = [];
      // 生成[0, 100000]之间的随机数
      for (let i = 0; i < 100000; i++) {
        arr.push(0 + Math.floor((100000 - 0 + 1) * Math.random()))
      }
    
      Array.prototype.unique = function () {
        const tmp = new Map();
        return this.filter(item => {
          return !tmp.has(item) && tmp.set(item, 1);
        })
      }
    
      // ...实现算法
      console.time('test');
      console.log(arr.unique().sort((a, b) => a - b))
      console.timeEnd('test');
      console.log(arr.sort((a, b) => a - b))
  • 相关阅读:
    “朋友圈”又添好友,DataPipeline与统信服务器操作系统完成产品互认证
    DataPipeline与飞腾完成产品兼容性互认证,携手共建自主IT底层生态
    「山东城商行联盟」数据库准实时数据采集系统上线,DataPipeline助力城市商业银行加快数字化转型
    DataPipeline 实时数据融合产品入驻青云云市场,催化企业数据价值释放
    2020年净利暴涨1288%,遨森电商携手DataPipeline构建实时数据融合体系跑出加速度!
    宏昆酒店集团携手DataPipeline打造实时数据融合平台,酒店业精益管理的新秘诀
    销售易携手DataPipeline,推动“实时感知主动决策客户成功”的变革!
    DataPipeline助力悠星网络出海,以实时数据管理护航爆款游戏
    FIGR/IR业务流程
    ABAP调用堆栈
  • 原文地址:https://www.cnblogs.com/sspeng/p/6577216.html
Copyright © 2011-2022 走看看