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 相关文章推荐
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
Jul 08 Javascript
Javascript alert消息换行的方法
Aug 07 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
Apr 06 Javascript
jquery修改网页背景颜色通过css方法实现
Jun 06 Javascript
jQuery中live()方法用法实例
Jan 19 Javascript
JS常见算法详解
Feb 28 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
Mar 30 Javascript
详解Vue单元测试case写法
May 24 Javascript
javascript中关于类型判断的一些疑惑小结
Oct 14 Javascript
详解angular2 控制视图的封装模式
Dec 27 Javascript
js常见遍历操作小结
Jun 06 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
Feb 14 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
基于Zend的Config机制的应用分析
2013/05/02 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
JavaScript延迟加载
2021/03/09 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
浅谈react 同构之样式直出
2017/11/07 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
python条件和循环的使用方法
2013/11/01 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
python list转置和前后反转的例子
2019/08/26 Python
Python网页解析器使用实例详解
2020/05/30 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
几道Web/Ajax的面试题
2016/11/05 面试题
国际商务专业学生个人的自我评价
2013/09/28 职场文书
查环查孕证明
2014/01/10 职场文书
创先争优承诺书
2015/01/20 职场文书
美容院管理规章制度
2015/08/05 职场文书
Python 视频画质增强
2022/04/28 Python