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 相关文章推荐
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
Oct 23 Javascript
理解JSON:3分钟课程
Oct 28 Javascript
Array.prototype.concat不是通用方法反驳[译]
Sep 20 Javascript
Eval and new funciton not the same thing
Dec 27 Javascript
javaScript NameSpace 简单说明介绍
Jul 18 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
Oct 17 Javascript
jquery实现简单手风琴菜单效果实例
Jun 13 Javascript
javaScript中的原型解析【推荐】
May 05 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
Nov 10 Javascript
AngularJS双向绑定和依赖反转实例详解
Apr 15 Javascript
vue页面使用阿里oss上传功能的实例(一)
Aug 09 Javascript
简单了解JavaScript sort方法
Nov 25 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
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
Javascript如何判断数据类型和数组类型
2016/06/22 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
对于Python装饰器使用的一些建议
2015/06/03 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
Python 使用office365邮箱的示例
2020/10/29 Python
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
运动会稿件200字
2014/02/07 职场文书
车队司机自我鉴定
2014/03/02 职场文书
捐赠仪式主持词
2014/03/19 职场文书
幼儿园新年寄语
2014/04/03 职场文书
勤俭节约倡议书
2014/04/14 职场文书
企业介绍信范文
2015/01/30 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python
Python Matplotlib绘制动画的代码详解
2022/05/30 Python