javascript实现数组去重的多种方法


Posted in Javascript onMarch 14, 2016

废话不多说,直接拿干货!

先说说这个实例的要求:写一个方法实现数组的去重。(要求:执行方法,传递一个数组,返回去重后的新数组,原数组不变,实现过程中只能用一层循环,双层嵌套循环也可写,只做参考);

先给初学者解释一下什么叫数组去重(老鸟跳过):意思就是讲数组里面重复的元素去掉,比如说var arr = [3,2,4,2,1,2]; 数组去重得到的新数组是 [3,2,4,1],就是这么一个功能。

实现方法比较简单,实现的方式也比较多,很多大牛也写过相关的文章,之所以写这边博客,旨在一是备忘,二是给初学者能更好的理解其实现的原理,好,我们看第一种实现方式:

第一种,通过遍历新数组来去重

var arr = [1,'b','b',4,3,3,4,5,1];
     
    //第一种
    Array.prototype.unique1 = function(){
      var arr1 = []; //定义一个新数组
      for(var i=0;i<this.length;i++){
        if(arr1.indexOf(this[i]) == -1){//判断目标数组中在原数组里是否存在
          arr1.push(this[i]);
        } 
      } 
      return arr1;
    }
    console.log(arr); //[1,'b','b',4,3,3,4,5,1]
    console.log(arr.unique1()); //[1, "b", 4, 3, 5]
    //这种方法的主要思路就是,新建一个数组,然后在原数组中,从第一个开始,看看新数组里面有没有这个元素,如果有,就忽略,然后进行下一个,如果没有,则把这个元素存到新数组里面,
    //也就是说,每一次比较,都会遍历新数组,直到找到相同元素为止,比较耗性能

如果大家不习惯这个写法,可以改成下面的写法,效果是一样的:

var arr = [1,'b','b',4,3,3,4,5,1];

function unique1(arr){
      var arr1 = [];
      for(var i=0;i<arr.length;i++){
        if(arr1.indexOf(arr[i]) == -1){//判断目标数组中在原数组里是否存在
          arr1.push(arr[i]); 
        } 
      } 
      return arr1;
    }
    console.log(arr); //[1,'b','b',4,3,3,4,5,1]
    console.log(unique1(arr)); //[1, "b", 4, 3, 5]

下面的方法我就不改写法了,你们可以按照上面的格式来改写一下,结果我也不输出了,因为结果是一样的,注释写在代码中,慢慢体会一下

第二种,通过hash表(这个概念有点大,具体原理就不在这里细说了,有时间我会单独写一遍,这是好东西)实现

var arr = [1,'b','b',4,3,3,4,5,1];

Array.prototype.unique2 = function(){
      var hash = {}; //定义一个hash表
      var arr1 = []; //定义一个新数组
      for(var i=0;i<this.length;i++){
        /*
          这里比较难理解,我们一步一步来看:
          hash是一个对象,则存在键值对(key:value),只不过现在是为空的,所以hash[key] = value;
          第一步:i=0;this[i]=this[0]=1; hash[this[0]] = hash[1] , 因为hash初始为空,没有找到key=1的值,所以然后undefined,
          执行下一步:hash[1] = true(此时hash对象就有了第一组键值对),将原数组的第一个数添加到新数组中,重复第一步
          因为不重复的判断hash的值都是undefined,而重复的都为true了,所以不重复都被添加到新数组中
          因为hash表存的值是存的地址,放在堆内存中,所以有多少个不重复的元素,就要分多少个内存来存放,所以这种方法比较占内存,但是相比之下,这种的运算运动是最快的,
          这也就是用空间来换取时间了,数据量比较小,推荐用此方法
        */
        if(! hash[this[i]]){
          hash[this[i]] = true;
          arr1.push(this[i]);
        }
      }
      return arr1;  
    }
    console.log(arr);
    console.log(arr.unique2());

第三种,通过遍历自身的位置是否一致来实现

var arr = [1,'b','b',4,3,3,4,5,1];

Array.prototype.unique3 = function(){
      var arr1 = []; //定义一个新数组
      for(var i=0;i<this.length;i++){
        if(this.indexOf(this[i])==i){
        //这里也是indexOf遍历,看从第一个元素在原数组中的位置,如果第一次出现的位置和下标相等,说明当前元素的不重复的,如果不等,说明该元素前面已经出现过
          arr1.push(this[i]);
        }
      }
      return arr1;  
    }
    console.log(arr);
    console.log(arr.unique3());

第四种,这个有点意思,只能运用到特殊场合,就是先跟数组排序,然后22比较,输出一个排序过的新数组

Array.prototype.unique4 = function(){
      /*
        这里是思路是,先排序(默认从小到大),然后将原数组的第一个给新数组,
        因为是经过排序的,所以重复的只会存在在相邻位置
        这里就相当于是做22比较,如果相等,则进行下一组,如果不相等,则把这个数存到新数组中,用这个数再进行比较
      */
      this.sort();
      var arr1 = [this[0]];
      for(var i=1;i<this.length;i++){
        if(this[i] !== arr1[arr1.length-1]){
          arr1.push(this[i]);
        } 
      }
      return arr1;  
    }
    console.log(arr);
    console.log(arr.unique4());

哇哈,打完收工!

要求里面还说,可以使用双层嵌套循环来实现,无法就是用2层for循环,让每一个与原数组去比较

Array.prototype.unique5 = function(){
      //双层循环,一一比较
      for(var i=0;i<this.length;i++){ //从0开始
        for(j= i+1;j<this.length;j++){ //从1开始,逐个比较
          if(this[i] === this[j]){ //如果恒定
            this.splice(j,1);  //就将这个元素删掉
          } 
        } 
      }
      return this;  
    }
    console.log(arr);
    console.log(arr.unique5());

这种写法的循环次数太多,不推荐,有人会说,第一种和第三种不也是每次都遍历一遍吗?跟第5种感觉也差不多呢?是的,你能这么理解,说明你理解了,但是呢,又不是特别的理解,我们说差不多那可就差太多了,indexOf()表示的是找到第一个匹配的元素就会

停止遍历,而第5种则是不管找不找得到,都会把整个数组遍历一遍,如果数据量大,那你觉得哪个性能要好一点?

特别注意的一点:如果在比较两两之间的值是全等或不等的时候,一定要用恒定(===)和不恒定(!==),因为这会涉及到元素的类型上,如 1与'1'是不恒等的!

上面的可真是干货了,一点水分都没有,只能靠大家自己领悟了!

Javascript 相关文章推荐
获取客户端网卡MAC地址和IP地址实现JS代码
Mar 17 Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
Aug 28 Javascript
jQuery调取jSon数据并展示的方法
Jan 29 Javascript
浅谈javascript中call()、apply()、bind()的用法
Apr 20 Javascript
JS、jQuery中select的用法详解
Apr 21 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
May 18 Javascript
JS中定位 position 的使用实例代码
Aug 06 Javascript
layui table 参数设置方法
Aug 14 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
Oct 09 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
Nov 09 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
Sep 12 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
Sep 29 Javascript
javascript实现PC网页里的拖拽效果
Mar 14 #Javascript
Jquery实现简单的轮播效果(代码管用)
Mar 14 #Javascript
node模块机制与异步处理详解
Mar 13 #Javascript
JS中创建函数的三种方式及区别
Mar 13 #Javascript
使用jQuery操作HTML的table表格的实例解析
Mar 13 #Javascript
Javascript数组Array方法解读
Mar 13 #Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
Mar 13 #Javascript
You might like
PHP 快速排序算法详解
2014/11/10 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
python实现数独算法实例
2015/06/09 Python
打包发布Python模块的方法详解
2016/09/18 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
幼儿运动会邀请函
2014/01/17 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL