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中使用replace结合正则实现replaceAll的效果
Jun 04 Javascript
jQuery客户端分页实例代码
Nov 18 Javascript
jquery清空表单数据示例分享
Feb 13 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
Dec 28 Javascript
javascript实现动态标签云
Oct 16 Javascript
基于bootstrap实现广告轮播带图片和文字效果
Jul 22 Javascript
Jquery表单验证失败后不提交的解决方法
Oct 18 Javascript
javascript 中关于array的常用方法详解
May 05 Javascript
vuejs手把手教你写一个完整的购物车实例代码
Jul 06 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
Jul 11 Javascript
node中使用log4js4.x版本记录日志的方法
Aug 20 Javascript
vue项目在webpack2实现移动端字体自适配功能
Jun 02 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
最简单的PHP程序--记数器
2006/10/09 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
sina的lightbox效果。
2007/01/09 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
10分钟学会js处理json的常用方法
2020/12/06 Javascript
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
python自动发送邮件脚本
2018/06/20 Python
python numpy 按行归一化的实例
2019/01/21 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
竞聘演讲稿
2014/04/24 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏