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 相关文章推荐
基于jquery实现控制经纬度显示地图与卫星
May 20 Javascript
探讨jQuery的ajax使用场景(c#)
Dec 03 Javascript
利用JS判断用户是否上网(连接网络)
Dec 23 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
Feb 19 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
Nov 20 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
Mar 14 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
Jun 01 Javascript
setTimeout与setInterval的区别浅析
Mar 23 Javascript
three.js利用卷积法如何实现物体描边效果
Nov 27 Javascript
jquery实现直播弹幕效果
Nov 28 jQuery
微信小程序关键字变色实现代码实例
Dec 13 Javascript
vue 检测用户上传图片宽高的方法
Feb 06 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
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
yii上传文件或图片实例
2014/04/01 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
学前端,css与javascript重难点浅析
2020/06/11 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
遍历python字典几种方法总结(推荐)
2016/09/11 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
GWT都有什么特性
2016/12/02 面试题
大学生毕业自我评价范文分享
2013/11/11 职场文书
英语国培研修感言
2014/02/13 职场文书
酒店员工检讨书
2014/02/18 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏