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 xml为数据源的下拉框控件
Jul 07 Javascript
js中各浏览器中鼠标按键值的差异
Apr 07 Javascript
jquery对象和javascript对象即DOM对象相互转换
Aug 07 Javascript
jQuery中toggle()函数的使用实例
Apr 17 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
Dec 07 Javascript
javascript中eval解析JSON字符串
Feb 27 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
Nov 07 Javascript
基于vue实现分页效果
Nov 06 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
angular 内存溢出的问题解决
Jul 12 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
Aug 10 Javascript
JavaScript this绑定过程深入详解
Dec 07 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
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
PHP 开发环境配置(Zend Server安装)
2010/04/28 PHP
php通用防注入程序 推荐
2011/02/26 PHP
php实现微信公众号无限群发
2015/10/11 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
python实现桌面托盘气泡提示
2019/07/29 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
详解python对象之间的交互
2020/09/29 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
python中封包建立过程实例
2021/02/18 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
水污染治理工程专业自荐信
2014/06/21 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
硕士论文致谢范文
2015/05/14 职场文书
2015年度企业工作总结
2015/05/21 职场文书
大学生暑假实习总结
2015/07/13 职场文书