javascript数组去重的方法汇总


Posted in Javascript onApril 14, 2015

四种算法来实现这个目的:

第一种:

Array.prototype.unique1 = function () {
 var n = []; //一个新的临时数组
 for (var i = 0; i < this.length; i++) //遍历当前数组
 {
  //如果当前数组的第i已经保存进了临时数组,那么跳过,
  //否则把当前项push到临时数组里面
  if (n.indexOf(this[i]) == -1) n.push(this[i]);
 }
 return n;
}

第二种:

Array.prototype.unique2 = function()
{
    var n = {},r=[]; //n为hash表,r为临时数组
    for(var i = 0; i < this.length; i++) //遍历当前数组
    {
        if (!n[this[i]]) //如果hash表中没有当前项
        {
            n[this[i]] = true; //存入hash表
            r.push(this[i]); //把当前数组的当前项push到临时数组里面
        }
    }
    return r;
} //此方法比较推荐 ,但不能呢过考虑到“222”和222的问题

第二种改进版:

//类hash方法的改进版
Array.prototype.unique2 = function () {
  var n = {}, r = [];
  for (var i = 0; i < this.length; i++) {
    if (!n[typeof (this[i]) + this[i]]) {
      n[typeof (this[i]) + this[i]] = true;
      r.push(this[i])
    }
  }
  return r
};

var arr=["222",222,2,2,3];
var newarry=arr.unique2();
console.log(newarry[newarry.length-1]);

  

第三种:

Array.prototype.unique3 = function()
{
    var n = [this[0]]; //结果数组
    for(var i = 1; i < this.length; i++) //从第二项开始遍历
    {
        //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
        //那么表示第i项是重复的,忽略掉。否则存入结果数组
        if (this.indexOf(this[i]) == i) n.push(this[i]);
    }
    return n;
}

    其中第1种和第3种方法都用到了数组的indexOf方法。此方法的目的是寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所以此函数会浪费掉很多时间。 而第2中方法用的是hash表。把已经出现过的通过下标的形式存入一个object内。下标的引用要比用indexOf搜索数组快的多。

    为了判断这三种方法的效率如何,我做了一个测试程序,生成一个10000长度的随机数组成的数组,然后分别用几个方法来测试执行时间。 结果表明第二种方法远远快于其他两种方法。 但是内存占用方面应该第二种方法比较多,因为多了一个hash表。这就是所谓的空间换时间。  就是这个 测试页面,你也可以去看看。

第四种方法:

Array.prototype.unique4 = function()
{
    this.sort();
    var re=[this[0]];
    for(var i = 1; i < this.length; i++)
    {
        if( this[i] !== re[re.length-1])
        {
            re.push(this[i]);
        }
    }
    return re;
}

    这个方法的思路是先把数组排序,然后比较相邻的两个值。 排序的时候用的JS原生的sort方法,JS引擎内部应该是用的快速排序吧。 最终测试的结果是此方法运行时间平均是第二种方法的三倍左右,不过比第一种和第三种方法快了不少。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
javascript 对象的定义方法
Jan 10 Javascript
jquery indexOf使用方法
Aug 19 Javascript
JS教程:window.location使用方法的区别介绍
Oct 04 Javascript
Node.js中HTTP模块与事件模块详解
Nov 14 Javascript
javascript框架设计读书笔记之种子模块
Dec 02 Javascript
JavaScript的9种继承实现方式归纳
May 18 Javascript
jQuery UI库中dialog对话框功能使用全解析
Apr 23 Javascript
canvas实现图像放大镜
Feb 06 Javascript
js使用swiper实现层叠轮播效果实例代码
Dec 12 Javascript
微信小程序云开发如何实现数据库自动备份实现
Aug 16 Javascript
微信小程序使用蓝牙小插件
Sep 23 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 Javascript
JavaScript字符串常用类使用方法汇总
Apr 14 #Javascript
JavaScript 表单处理实现代码
Apr 13 #Javascript
JavaScript 事件绑定及深入
Apr 13 #Javascript
JavaScript 事件对象介绍
Apr 13 #Javascript
JavaScript 事件入门知识
Apr 13 #Javascript
JavaScript 动态加载脚本和样式的方法
Apr 13 #Javascript
JavaScript DOM元素尺寸和位置
Apr 13 #Javascript
You might like
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
php调用Google translate_tts api实现代码
2013/08/07 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
跟老齐学Python之dict()的操作方法
2014/09/24 Python
使用pdb模块调试Python程序实例
2015/06/02 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
Python for循环与range函数的使用详解
2019/03/23 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
应届大学生的推荐信
2013/11/20 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
股东协议书
2014/04/14 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
2014年政教处工作总结
2014/12/20 职场文书
驳回起诉裁定书
2015/05/19 职场文书
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python