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 相关文章推荐
Yii-自定义删除确认弹框(zyd)jquery实现代码
Mar 04 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
Mar 13 Javascript
微信小程序 教程之注册程序
Oct 17 Javascript
jQuery实现手机上输入后隐藏键盘功能
Jan 04 Javascript
关于Vue实现组件信息的缓存问题
Aug 23 Javascript
详解vue移动端项目的适配(以mint-ui为例)
Aug 17 Javascript
vue 自定义指令自动获取文本框焦点的方法
Aug 25 Javascript
js前端面试之同步与异步问题详解
Apr 03 Javascript
vue实现全匹配搜索列表内容
Sep 26 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
Sep 27 Javascript
基于原生JS封装的Modal对话框插件的示例代码
Sep 09 Javascript
javascript实现数字时钟效果
Feb 06 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
php设计模式 Builder(建造者模式)
2011/06/26 PHP
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
vue.js 实现点击展开收起动画效果
2018/07/07 Javascript
深入理解Promise.all
2018/08/08 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
python 8种必备的gui库
2020/08/27 Python
python 实现汉诺塔游戏
2020/11/28 Python
python 对xml解析的示例
2021/02/27 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
食堂员工工作职责
2013/12/18 职场文书
小学数学教学反思
2014/02/02 职场文书
大学生社会实践方案
2014/05/11 职场文书
迎新晚会策划方案
2014/06/13 职场文书
《火烧云》教学反思
2016/02/23 职场文书
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技