Javascript 数组去重的方法(四种)详解及实例代码


Posted in Javascript onNovember 24, 2016

 Javascript 数组去重的四种方法

四种算法来实现这个目的:

第一种方法:

Array.prototype.unique1 = function () {
 var n = []; //一个新的临时数组
 for (var i = 0; i < this.length; i++) //遍历当前数组
 {
  //如果当前数组的第i已经保存进了临时数组,那么跳过,
  //否则把当前项push到临时数组里面
  if (n.indexOf(this[i]) == -1) n.push(this[i]);
 }
 return n;
}

 第二种方法:

Array.prototype.unique2 = function()
{
 var n = {},r=[]; //n为hash表,r为临时数组
 for(var i = 0; i < this.length; i++) //遍历当前数组
 {
 if (!n[this[i]]) //如果hash表中没有当前项
 {
  n[this[i]] = true; //存入hash表
  r.push(this[i]); //把当前数组的当前项push到临时数组里面
 }
 }
 return r;
}
var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]
alert(arr.unique2());

 第三种方法:

Array.prototype.unique3 = function()
{
 var n = [this[0]]; //结果数组
 for(var i = 1; i < this.length; i++) //从第二项开始遍历
 {
 //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
 //那么表示第i项是重复的,忽略掉。否则存入结果数组
 if (this.indexOf(this[i]) == i) n.push(this[i]);
 }
 return n;
}

  其中第1种和第3种方法都用到了数组的indexOf方法。此方法的目的是寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所以此函数会浪费掉很多时间。 而第2中方法用的是hash表。把已经出现过的通过下标的形式存入一个object内。下标的引用要比用indexOf搜索数组快的多。

    为了判断这三种方法的效率如何,我做了一个测试程序,生成一个10000长度的随机数组成的数组,然后分别用几个方法来测试执行时间。 结果表明第二种方法远远快于其他两种方法。 但是内存占用方面应该第二种方法比较多,因为多了一个hash表。这就是所谓的空间换时间。  就是这个 测试页面,你也可以去看看。

第四种方法:

Array.prototype.unique4 = function()
{
 this.sort();
 var re=[this[0]];
 for(var i = 1; i < this.length; i++)
 {
 if( this[i] !== re[re.length-1])
 {
  re.push(this[i]);
 }
 }
 return re;
}

    这个方法的思路是先把数组排序,然后比较相邻的两个值。 排序的时候用的JS原生的sort方法,JS引擎内部应该是用的快速排序吧。 最终测试的结果是此方法运行时间平均是第二种方法的三倍左右,不过比第一种和第三种方法快了不少。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
数组Array进行原型prototype扩展后带来的for in遍历问题
Feb 07 Javascript
js判断上传文件的类型和大小示例代码
Oct 18 Javascript
原生javaScript实现图片延时加载的方法
Dec 22 Javascript
JavaScript中的全局对象介绍
Jan 01 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
May 03 Javascript
jQuery根据ID、CLASS、等获取对象的实例
Dec 04 Javascript
jquery表单验证实例仿Toast提示效果
Mar 03 Javascript
Angular.js中定时器循环的3种方法总结
Apr 27 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
Oct 18 Javascript
Vue.js实现的计算器功能完整示例
Jul 11 Javascript
JS实现中英文混合文字溢出友好截取功能
Aug 06 Javascript
node+multer实现图片上传的示例代码
Feb 18 Javascript
BootStrap树状图显示功能
Nov 24 #Javascript
Bootstrop实现多级下拉菜单功能
Nov 24 #Javascript
AngularJS自定义服务与fliter的混合使用
Nov 24 #Javascript
微信小程序-详解数据缓存
Nov 24 #Javascript
如何实现json数据可视化详解
Nov 24 #Javascript
BootStrap 可编辑表Table格
Nov 24 #Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 #Javascript
You might like
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
php结合表单实现一些简单功能的例子
2011/06/04 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
jupyter安装小结
2016/03/13 Python
Python标准库sched模块使用指南
2017/07/06 Python
django 多数据库配置教程
2018/05/30 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
2018/12/07 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
Python enumerate内置库用法解析
2020/02/24 Python
上海微创软件面试题
2012/06/14 面试题
简短证婚人证婚词
2014/01/09 职场文书
房产委托公证书
2014/04/08 职场文书
《将心比心》教学反思
2014/04/08 职场文书
化工实习心得体会
2014/09/09 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
给老师的一封感谢信
2015/01/20 职场文书
MySQL 逻辑备份 into outfile
2022/05/15 MySQL