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 面向对象全新理练之继承与多态
Dec 03 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
Feb 17 Javascript
JavaScript定义类和对象的方法
Nov 26 Javascript
js简单的点击返回顶部效果实现方法
Apr 10 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
浅析Javascript ES6中的原生Promise
Aug 25 Javascript
微信小程序 Record API详解及实例代码
Sep 30 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
Dec 31 Javascript
js编写简单的聊天室功能
Aug 17 Javascript
JavaScript函数的特性与应用实践深入详解
Dec 30 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
May 22 Javascript
JS中this的4种绑定规则详解
Feb 04 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
VFP与其他应用程序的集成
2006/10/09 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
php截取视频指定帧为图片
2016/05/16 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
原生JS实现图片懒加载之页面性能优化
2019/04/26 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
python xml解析实例详解
2016/11/14 Python
python利用正则表达式提取字符串
2016/12/08 Python
关于Django外键赋值问题详解
2017/08/13 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
python中adb有什么功能
2020/06/07 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
移动端HTML5实现文件上传功能【附代码】
2016/03/25 HTML / CSS
HTML5 Blob对象的具体使用
2020/05/22 HTML / CSS
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
体育教育毕业生自荐信
2014/06/29 职场文书
2014小学年度工作总结
2014/12/20 职场文书
2015年电工工作总结
2015/04/10 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
小学运动会开幕词
2016/03/04 职场文书
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python
mysql的Buffer Pool存储及原理
2022/04/02 MySQL
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL