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获得选中文本内容的方法
Dec 02 Javascript
Javascript实现网络监测的方法
Jul 31 Javascript
浅谈如何实现easyui的datebox格式化
Jun 12 Javascript
Js自定义多选框效果的实例代码
Jul 05 Javascript
React组件中的this的具体使用
Feb 28 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
Feb 25 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
Mar 31 Javascript
Vuex实现数据增加和删除功能
Nov 11 Javascript
webgl实现物体描边效果的方法介绍
Nov 27 Javascript
原生JS与CSS实现软件卸载对话框功能
Dec 05 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
Jul 21 Javascript
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
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 Curl出现403错误的解决办法
2014/05/29 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
JavaScript获取当前网页最后修改时间的方法
2015/04/03 Javascript
js获取form的方法
2015/05/06 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
python单例模式获取IP代理的方法详解
2018/09/13 Python
Python基于百度云文字识别API
2018/12/13 Python
python中的时区问题
2021/01/14 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
优秀求职信范文分享
2014/01/26 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
自主招生自荐信指南
2014/02/04 职场文书
团拜会策划方案
2014/06/07 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
合作意向书
2014/07/30 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
校长师德表现自我评价
2015/03/05 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
教师节座谈会主持词
2015/07/03 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
python OpenCV学习笔记
2021/03/31 Python