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 相关文章推荐
图片完美缩放
Sep 07 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
Jun 28 Javascript
理解JavaScript的变量的入门教程
Jul 07 Javascript
轻松搞定jQuery.noConflict()
Feb 15 Javascript
JS实现探测网站链接的方法【测试可用】
Nov 08 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
Aug 25 Javascript
vue页面加载闪烁问题的解决方法
Mar 28 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
Aug 16 Javascript
使用Vue实现调用接口加载页面初始数据
Oct 28 Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 Javascript
深入解读VUE中的异步渲染的实现
Jun 19 Javascript
使用Typescript开发微信小程序的步骤详解
Jan 12 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 define()函数以及defined()函数的用法详解
2013/06/05 PHP
Yii入门教程之Yii安装及hello world
2014/11/25 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
js一组验证函数
2008/12/20 Javascript
为Extjs加加速(javascript加速)
2010/08/19 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
Jquery的each里用return true或false代替break或continue
2014/05/21 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
总结js函数相关知识点
2018/02/27 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
JS如何生成随机验证码
2020/03/02 Javascript
VsCode里的Vue模板的实现
2020/08/12 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
Python脚本实现集群检测和管理功能
2015/03/06 Python
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
python应用文件读取与登录注册功能
2019/09/23 Python
python爬虫 正则表达式解析
2019/09/28 Python
Python银行系统实战源码
2019/10/25 Python
python列表返回重复数据的下标
2020/02/10 Python
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
几个判断型的面试题
2012/07/03 面试题
五年级语文教学反思
2014/01/30 职场文书
入党申请自荐书范文
2014/02/11 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书
个人工作表现评价材料
2014/09/21 职场文书
月考总结与反思
2015/10/22 职场文书
七年级语文教学反思
2016/03/03 职场文书
Redis如何一键部署脚本
2021/04/12 Redis
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL