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 相关文章推荐
javascript检测页面是否缩放的小例子
May 16 Javascript
javaScript NameSpace 简单说明介绍
Jul 18 Javascript
取得元素的左和上偏移量的方法
Sep 17 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
Jul 01 Javascript
js利用正则表达式检验输入内容是否为网址
Jul 05 Javascript
js中scrollTop()方法和scroll()方法用法示例
Oct 03 Javascript
基于Vue2的移动端开发环境搭建详解
Nov 03 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
Dec 31 Javascript
javaScript封装的各种写法
Aug 14 Javascript
Vue.js自定义事件的表单输入组件方法
Mar 08 Javascript
Vue-不允许嵌套式的渲染方法
Sep 13 Javascript
egg.js的基本使用和调用数据库的方法示例
May 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
PHP获取文件行数的方法
2015/06/10 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
python的三目运算符和not in运算符使用示例
2014/03/03 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
python自动发送邮件脚本
2018/06/20 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
python实现烟花小程序
2019/01/30 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
班长自荐书范文
2014/02/11 职场文书
文明村创建实施方案
2014/03/27 职场文书
单位工作证明
2014/10/07 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
导游词之湖州-太湖
2019/10/11 职场文书