JavaScript数组去重的3种方法和代码实例


Posted in Javascript onJuly 01, 2015

数组去重的方法有很多,到底哪种是最理想的,自己不清楚。于是自己测试了下数组去重的效果和性能。测试十万个数据,代码和所耗大概时间如下。

到底采用哪种方法,根据实际情况而定吧。

/*方法一: 1,'1' 会被认为是相同的; 所有hash对象,如:{x;1},{y:1}会被认为是相同的 //10ms */
Array.prototype.unique=function(){
  var newArr=[],obj={};
  for(var i=0,len=this.length;i<len;i++){
    if(!obj[this[i]]){ 
      newArr.push(this[i]);
      obj[this[i]]=true;
    }
  }
  return newArr;
}

/*方法一改进版:所有hash对象,如:{x;1},{y:1}会被认为是相同的 //30ms*/
Array.prototype.unique=function(){
  var newArr=[],obj={};
  for(var i=0,len=this.length;i<len;i++){
    if(!obj[typeof(this[i])+this[i]]){ 
      newArr.push(this[i]);
      obj[typeof(this[i])+this[i]]=this[i];
    }
  }
  return newArr;
}

/*方法二: 去重结果最好,但耗性能   //250ms*/
Array.prototype.unique=function(){
  var newArr=this.concat();
  for(var i=0,len=newArr.length;i<len;i++) {
    for(var j=i+1,len=newArr.length;j<len;j++) {
      //注意 ===
      if(newArr[i]===newArr[j]) {
        newArr.splice(j,1);
        j--;
      }
    }
  }
  return newArr;
}

/*方法三: 不能去重hash对象 //25ms */
Array.prototype.unique = function(){
  var newArr = []; //一个新的临时数组
  for(var i = 0,len=this.length; i < len; i++){    
    if (newArr.indexOf(this[i]) == -1){  //如果当前数组的第i已经保存进了临时数组,那么跳过,否则把当前项push到临时数组里面
      newArr.push(this[i]);
    }
  }
  return newArr;
}


var arr0=[11,21,221,13,24,"134","1",{x:1,y:1},{name:"pobaby",age:"12",hobby:"football"},{name:"pobaby1",age:"121",hobby:"football1"},{x:134},{y:132},{x:143},{y:3421},"神秘人物", "火柴人技巧格斗", "超音速战场", "小小辛打砖块", "火柴人技巧格斗", "加菲猫超人", "小小辛打砖块", "卑鄙的我2", "电流导线", "飞天手推车","神D秘人物", "火柴人S技巧格斗", "超音SD速战场", "小小SD辛打砖块", "火柴人SD技巧格斗", "加菲S猫超人", "小小DF辛打砖块", "卑鄙的FS我2", "电D流导线", "飞天SD手推车","神秘SD人物", "火柴人技D巧格斗", "超音ASD速战场", "小小辛打SAD砖块", "火柴人技SD巧格斗", "加菲FDS猫超人", "小小辛打SDF砖块", "卑鄙SDF的我2", "电流SDF导线", "飞天手DF推车","神秘SD人物", "火柴人技AS巧格斗", "超音速战FS场", "小小辛SDF打砖块", "火柴人SDF技巧格斗", "加菲SD猫超人",113,231,2221,123,234,"1334","21",{x:13,y:132},{name:"pobaby2",age:"122",hobby:"football2"},{name:"pobaby13",age:"1231",hobby:"football41"},{x:13544},{y:1352},{x:14543},{y:34521},"神秘人sd物", "火柴人技sd巧格斗", "超音速sd战场", "小小辛sd打砖块", "火柴人技巧gw格斗", "加菲猫ui超人", "小小辛yi打砖块", "卑鄙的yi我2", "电流yt导线", "飞天手ytui推车","神Dyu秘人物", "火yui柴人S技yui巧格斗", "超音SDyu速战场", "小小SD辛打砖uyi块", "火柴yui人SD技巧格斗", "加yui菲S猫超人", "小小DF辛打砖ui块", "卑鄙uyi的FS我2", "电D流导yui线", "飞天SD手推uyi车","神i秘SD人物", "火柴人技Dhk巧格斗", "超音ASD速战hk场", "小小辛打SAhkD砖块", "火柴人技SD巧ghk格斗", "加菲FDS猫k超人", "小小辛打SDF砖ytui块", "卑鄙SDF的yui我2", "电流SDyuF导线", "飞天手yuiDF推车","神iy秘SD人hk物", "火柴uyi人技AS巧格hk斗", "超音hg速战FS场", "小小辛SDF打砖hjk块", "火柴人SDF技hj巧格斗", "加菲SDhk猫超人" ];

/*十万个随机数据*/
var arr=[],num;
for(var i = 0; i < 100000; i++){
  num=Math.floor(Math.random()*50);
  arr.push(arr0[num]);
}


var t1= new Date().getTime(); console.log(t1); //开始时间

arr.unique(); //去重

var t2 = new Date().getTime(); console.log(t2); //结束时间

console.log(t2-t1);
Javascript 相关文章推荐
用javascript自动显示最后更新时间
Mar 15 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
Jan 11 Javascript
浅析JavaScript中的类型和对象
Nov 29 Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 Javascript
Bootstrap Validator 表单验证
Jul 25 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
Sep 17 Javascript
在vue项目中使用sass语法问题
Jul 18 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
Aug 20 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
Feb 19 Javascript
Node.js API详解之 vm模块用法实例分析
May 27 Javascript
vue循环中点击选中再点击取消(单选)的实现
Sep 10 Javascript
JSON 入门教程基础篇 json入门学习笔记
Sep 22 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 #Javascript
JS实现简单的图书馆享元模式实例
Jun 30 #Javascript
JS建造者模式基本用法实例分析
Jun 30 #Javascript
JS模式之简单的订阅者和发布者模式完整实例
Jun 30 #Javascript
JS模式之单例模式基本用法
Jun 30 #Javascript
js简单工厂模式用法实例
Jun 30 #Javascript
JavaScript判断undefined类型的正确方法
Jun 30 #Javascript
You might like
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
自己动手做一个SQL解释器
2006/10/09 PHP
php 分页原理详解
2009/08/21 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
jQuery对表单的操作代码集合
2011/04/06 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
Vue 打包体积优化方案小结
2020/05/20 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
django之session与分页(实例讲解)
2017/11/13 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
python的继承知识点总结
2018/12/10 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
django rest framework使用django-filter用法
2020/07/15 Python
快速创建python 虚拟环境
2020/11/28 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
幼儿园教师获奖感言
2014/03/11 职场文书
选秀节目策划方案
2014/06/06 职场文书
2014年后勤工作总结
2014/11/18 职场文书
幼儿园教师辞职信
2019/06/21 职场文书