js数组去重的5种算法实现


Posted in Javascript onNovember 04, 2015

1.遍历数组法
最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下:

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

2.对象键值对法
该方法执行的速度比其他任何方法都快, 就是占用的内存大一些,实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意 点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。

// 速度最快, 占空间最多(空间换时间) 
function unique2(array){ 
var n = {}, r = [], len = array.length, val, type; 
for (var i = 0; i < array.length; i++) { 
val = array[i]; 
type = typeof val; 
if (!n[val]) { 
n[val] = [type]; 
r.push(val); 
} else if (n[val].indexOf(type) < 0) { 
n[val].push(type); 
r.push(val); 
} 
} 
return r; 
}

3.数组下标判断法
还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。

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

4.排序后相邻去除法
虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。

// 将相同的值相邻,然后遍历去除重复值 
function unique4(array){ 
array.sort(); 
var re=[array[0]]; 
for(var i = 1; i < array.length; i++){ 
if( array[i] !== re[re.length-1]){ 
  re.push(array[i]); 
 } 
 } 
 return re; 
}

5.优化遍历数组法
该方法的实现代码相当酷炫,实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)推荐

// 思路:获取没重复的最右一值放入新数组 
function unique5(array){ 
var r = []; 
for(var i = 0, l = array.length; i < l; i++) { 
 for(var j = i + 1; j < l; j++) 
  if (array[i] === array[j]) j = ++i; 
 r.push(array[i]); 
 } 
 return r; 
}

判断浏览器是否支持indexOf ,indexOf 为ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持

if (!Array.prototype.indexOf){ 
// 新增indexOf方法 
Array.prototype.indexOf = function(item){ 
var result = -1, a_item = null; 
if (this.length == 0){ 
return result; 
} 
for(var i = 0, len = this.length; i < len; i++){ 
a_item = this[i]; 
if (a_item === item){ 
result = i; 
break; 
} 
} 
return result; 
} 
}

以上就是为大家提供的5种JS数组去重的算法实现,希望对大家的学习有所帮助。
 

Javascript 相关文章推荐
一个javascript参数的小问题
Mar 02 Javascript
原生javascript获取元素样式属性值的方法
Dec 25 Javascript
js检查页面上有无重复id的实现代码
Jul 17 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
Dec 23 Javascript
javascritp添加url参数将参数加入到url中
Sep 25 Javascript
使用javascript实现判断当前浏览器
Apr 14 Javascript
跟我学习javascript的定时器
Nov 19 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
Dec 02 Javascript
基于jquery实现无限级树形菜单
Mar 22 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
Mar 08 Javascript
JS精确判断数据类型代码实例
Dec 18 Javascript
微信小程序picker组件两列关联使用方式
Oct 27 Javascript
解决js图片加载时出现404的问题
Nov 30 #Javascript
jquery实现的点击翻书效果代码
Nov 04 #Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
Nov 04 #Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
Nov 04 #Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 #Javascript
jQuery实现带有动画效果的回到顶部和底部代码
Nov 04 #Javascript
JavaScript前端开发之实现二进制读写操作
Nov 04 #Javascript
You might like
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
python中copy()与deepcopy()的区别小结
2018/08/03 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
什么是python的列表推导式
2020/05/26 Python
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
Linux的文件类型
2016/07/05 面试题
行政助理求职自荐信
2013/10/26 职场文书
国际会议邀请函范文
2014/01/16 职场文书
自动一体化专业求职信
2014/03/15 职场文书
2015年度招聘工作总结
2015/05/28 职场文书