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 实用的文字链提示框效果
Jun 30 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
May 11 Javascript
修复bash漏洞的shell脚本分享
Dec 31 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
Jul 26 Javascript
jQuery简单验证上传文件大小及类型的方法
Jun 02 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
angular.js指令中的controller、compile与link函数的不同之处
May 10 Javascript
详解node如何让一个端口同时支持https与http
Jul 04 Javascript
移动设备手势事件库Touch.js使用详解
Aug 18 Javascript
vue和webpack安装命令详解
Jun 15 Javascript
详解在React中跨组件分发状态的三种方法
Aug 09 Javascript
JavaScript 预解析的4种实现方法解析
Sep 03 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
日本十大惊悚动漫
2020/03/04 日漫
Apache设置虚拟WEB
2006/10/09 PHP
php学习 字符串课件
2008/06/15 PHP
php与java通过socket通信的实现代码
2013/10/21 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
微信小程序button组件使用详解
2018/01/31 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
Django发送html邮件的方法
2015/05/26 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
2019/04/15 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
大学军训通讯稿
2014/01/13 职场文书
三年级小学生评语
2014/04/22 职场文书
教师求职信范文
2014/05/24 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
计划生育工作总结2015
2015/04/03 职场文书
2015年小学生国庆节演讲稿
2015/07/30 职场文书
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技