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循环滚动图片代码
Dec 08 Javascript
struts2+jquery+json实现异步加载数据(自写)
Jun 24 Javascript
javascript实现加载xml文件的方法
Nov 24 Javascript
基于javascript实现全屏漂浮广告
Mar 31 Javascript
更靠谱的H5横竖屏检测方法(js代码)
Sep 13 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
Nov 01 Javascript
JavaScript获取ul中li个数的方法
Feb 13 Javascript
axios基本入门用法教程
Mar 25 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
Nov 03 Javascript
Vue利用canvas实现移动端手写板的方法
May 03 Javascript
微信小程序自定义音乐进度条的实例代码
Aug 28 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_MySQL教程-第一天
2007/03/18 PHP
php通过字符串调用函数示例
2014/03/02 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
jQuery知识点整理
2015/01/30 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
JavaScript数据结构与算法之链表
2016/01/29 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
Python生成随机密码的方法
2017/06/16 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
写自荐信要注意什么
2013/12/26 职场文书
小学教师节活动方案
2014/01/31 职场文书
高中生学习计划书
2014/09/15 职场文书
老人节标语大全
2014/10/08 职场文书
地道战观后感2000字
2015/06/04 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书
七个Python必备的GUI库
2021/04/27 Python
Redis数据结构之链表与字典的使用
2021/05/11 Redis
Java使用jmeter进行压力测试
2021/07/09 Java/Android
MongoDB支持的索引类型
2022/04/11 MongoDB