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

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

先给初学者解释一下什么叫数组去重(老鸟跳过):意思就是讲数组里面重复的元素去掉,比如说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'是不恒等的!

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

行文仓促,在下才疏学浅,如果大家有更好的实现方法,请你贴出来学习一下,那就不胜感激了,如果有不对的地方,万望指正,谢谢!

转载于:https://www.cnblogs.com/liugang-vip/p/5219307.html

javascript小实例,多种方法实现数组去重问题相关推荐

  1. 简单计算器——JavaScript小实例

    简单计算器--JavaScript小实例 先来看一下下我们要做的计算器(以iQOO neo5手机计算器为例): 这就是我们今天要做的计算器的模板,成品的样子会略有不同,但功能完善. 好,当我们看到这个 ...

  2. ES6使用Set方法进行数组去重

    在ES6中可以使用Set方法进行数组去重: let arr = [1,1,1,2,2,3,3,3,4,4]let set = new Set(arr)console.log(set); 输出结果:Se ...

  3. indexOf() 使用方法(数组去重)

    对于indexOf()的用法一直停留在查找第几个字符串,却不知道它能用到数组去重中,首先还是温顾下indexOf()的语法: <!DOCTYPE html> <html lang=& ...

  4. 重温 JavaScript 系列(2):数组去重、类数组转换数组

    在牛客上看到了一些汇总文章,这里总结一下JavaScript的数组去重解决方案: 假设测试数组: var arr = [1,1,2,2,3,'true','true',true,true,15,15, ...

  5. html怎么创建数组,js创建数组的三种方法 JS数组去重的几种常见方法

    JS数组有哪几种定义方式? js 里创建一个数组 那几种方式有什么区别吗?a = new Array(); b = []; 性能问题吗?? function clear(arr) { // 1 如何获 ...

  6. javascript ES6有趣的Set,数组去重、并集、交集、差集

    Set 对象存储的值总是唯一的 Set 对象方法 方法 描述 add 添加某个值,返回Set对象本身. clear 删除所有的键/值对,没有返回值. delete 删除某个键,返回true.如果删除失 ...

  7. javascript 练习(2)——js数组去重

    今天遇到一个数组去重的问题,如题 编写一个函数 unique(arr),返回一个去除数组内重复的元素的数组.例如:unique([0, 1, 2, 2, 3, 3, 4]) // => [0, ...

  8. 99乘法表带颜色HTML隔行变色,javascript小实例,实现99乘法表及隔行变色

    人生短暂,废话不多说,直奔主题! 这个小实例的要求: 实现在页面中输出99乘法表.(要求:以每三行为一组,实现隔行变色(颜色为白,红,黄(也可自己定义)),鼠标滑过每一行,行背景颜色变为蓝色,鼠标离开 ...

  9. 7种方法实现数组去重

    前言 去重是开发中经常会碰到的一个热点问题,不过目前项目中碰到的情况都是后台接口使用SQL去重,简单高效,基本不会让前端处理去重. 那么前端处理去重会出现什么情况呢?假如每页显示10条不同的数据,如果 ...

最新文章

  1. 【校招面试 之 C/C++】第15题 C 回调函数
  2. UA OPTI512R 傅立叶光学导论 衍射例题
  3. Linux系统:centOS 7 忘记密码怎么办?
  4. el表达式大小写问题的坑坑坑坑坑坑坑坑!!!
  5. PHP运行环境之IIS FastCGI 进程意外退出解决办法
  6. “小朋友”们节日快乐呀~
  7. S5PV210体系结构与接口02:ARM编程模型 汇编指令
  8. [redis] Redis 配置文件置参数详解
  9. linux中的root命令,在linux终端中执行root命令
  10. 任正非“2012实验室”讲话全文曝光
  11. 4.4 数据的寻址方式(立即寻址、直接寻址、间接寻址、寄存器寻址、相对地址)
  12. 【日语】日语一级句型强记
  13. 学生来看我,我自我满足...........
  14. 医院预约挂号系统使用说明
  15. 在win7 上安装 Visual Studio 2019 步骤 及 vs2019离线安装包
  16. 运行 python manage.py runserver
  17. java基础总结笔记
  18. 【Delphi】Android 桌面图标添加快捷菜单功能
  19. 360bpsvc一直占用电脑大量cpu,任务管理器也无法结束进程这个进程、360bpsvc也无法卸载的解决办法:
  20. 【自用】simetrix/simplis操作体验与问题分析(1)

热门文章

  1. Nginx详解五:Nginx基础篇之HTTP请求
  2. 10月18号站立会议
  3. G - Strongly connected - hdu 4635(求连通分量)
  4. JDK10都发布了,nio你了解多少?
  5. 《正则表达式经典实例(第2版)》——2.19 在替代文本中添加字面文本
  6. [elixir! #0037] Agent 小传
  7. WF4 持久化 第四篇
  8. 黄牛凭什么抢走我们的票?
  9. 解决IE下jquery ajax无法获得最新数据的问题(IE缓存)
  10. 基于管道模式的容器设计