javascript数组去重方法汇总


Posted in Javascript onApril 23, 2015

javascript数组去重方法汇总

Array.prototype.unique1 = function () {
 var n = []; //一个新的临时数组
 for (var i = 0; i < this.length; i++) //遍历当前数组
 {
  //如果当前数组的第i已经保存进了临时数组,那么跳过,
  //否则把当前项push到临时数组里面
  if (n.indexOf(this[i]) == -1) n.push(this[i]);
 }
 return n;
};
Array.prototype.unique2 = function()
{
  var n = {},r=[]; //n为hash表,r为临时数组
  for(var i = 0; i < this.length; i++) //遍历当前数组
  {
    if (!n[this[i]]) //如果hash表中没有当前项
    {
      n[this[i]] = true; //存入hash表
      r.push(this[i]); //把当前数组的当前项push到临时数组里面
    }
  }
  return r;
};
Array.prototype.unique3 = function()
{
  var n = [this[0]]; //结果数组
  for(var i = 1; i < this.length; i++) //从第二项开始遍历
  {
    //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
    //那么表示第i项是重复的,忽略掉。否则存入结果数组
    if (this.indexOf(this[i]) == i) n.push(this[i]);
  }
  return n;
};
Array.prototype.unique4 = function()
{
  this.sort();
  var re=[this[0]];
  for(var i = 1; i < this.length; i++)
  {
    if( this[i] !== re[re.length-1])
    {
      re.push(this[i]);
    }
  }
  return re;
};
var arr = [1,2,2,2,3,3,4,5];
console.log(arr.unique1()); // [1, 2, 3, 4, 5]
console.log(arr.unique2()); // [1, 2, 3, 4, 5]
console.log(arr.unique3()); // [1, 2, 3, 4, 5]
console.log(arr.unique4()); // [1, 2, 3, 4, 5]

其中第1种和第3种方法都用到了数组的indexOf方法。此方法的目的是寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所以此函数会浪费掉很多时间。 而第2中方法用的是hash表。把已经出现过的通过下标的形式存入一个object内。下标的引用要比用indexOf搜索数组快的多。

第四种方法的思路是先把数组排序,然后比较相邻的两个值。 排序的时候用的JS原生的sort方法,JS引擎内部应该是用的快速排序吧。 最终测试的结果是此方法运行时间平均是第二种方法的三倍左右,不过比第一种和第三种方法快了不少。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
dess中一个简单的多路委托的实现
Jul 20 Javascript
jQuery :nth-child前有无空格的区别分析
Jul 11 Javascript
基于jquery的loading 加载提示效果实现代码
Sep 01 Javascript
JQuery each打印JS对象的方法
Nov 13 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
JS实现的自定义网页拖动类
Nov 06 Javascript
AngularJS控制器之间的数据共享及通信详解
Aug 01 Javascript
浅析script标签中的defer与async属性
Nov 30 Javascript
浅述节点的创建及常见功能的实现
Dec 15 Javascript
使用Angular CLI生成 Angular 5项目教程详解
Mar 18 Javascript
vue项目前端知识点整理【收藏】
May 13 Javascript
Vue 同步异步存值取值实现案例
Aug 05 Javascript
javascript实现英文首字母大写
Apr 23 #Javascript
原生js和jquery实现图片轮播淡入淡出效果
Apr 23 #Javascript
浅谈javascript中for in 和 for each in的区别
Apr 23 #Javascript
原生js和jquery实现图片轮播特效
Apr 23 #Javascript
使用纯javascript实现经典扫雷游戏
Apr 23 #Javascript
jQuery图片特效插件Revealing实现拉伸放大
Apr 22 #Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
Apr 22 #Javascript
You might like
《APMServ 5.1.2》使用图解
2006/10/23 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
Python实现CET查分的方法
2015/03/10 Python
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
python3爬取数据至mysql的方法
2018/06/26 Python
python for和else语句趣谈
2019/07/02 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
python 常见的排序算法实现汇总
2020/08/21 Python
李宁官方网店:中国运动品牌
2017/11/02 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
YII2 全局异常处理深入讲解
2021/03/24 PHP
大专生自荐信
2013/10/04 职场文书
个人实用简单的自我评价
2013/10/19 职场文书
应届电子商务毕业自荐书范文
2014/02/11 职场文书
一句话工作感言
2014/03/01 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
教师培训学习心得体会
2016/01/21 职场文书
深入理解python多线程编程
2021/04/18 Python
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫