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 相关文章推荐
prototype 1.5相关知识及他人笔记
Dec 16 Javascript
javascript中巧用“闭包”实现程序的暂停执行功能
Apr 04 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
Dec 09 Javascript
javascript小数四舍五入多种方法实现
Dec 23 Javascript
js/jQuery对象互转(快速操作dom元素)
Feb 04 Javascript
jquery单行文字向上滚动效果示例
Mar 06 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
Jan 04 Javascript
jQuery常用的一些技巧汇总
Mar 26 Javascript
一分钟理解js闭包
May 04 Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 Javascript
swiper实现导航滚动效果
Dec 13 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 采集心得技巧
2009/05/15 PHP
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
php向js函数传参的几种方法
2014/08/10 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
js 为label标签和div标签赋值的方法
2013/08/08 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
Python中有趣在__call__函数
2015/06/21 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
python队列queue模块详解
2018/04/27 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
化工工艺专业求职信
2013/09/22 职场文书
会计岗位职责
2013/11/08 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
三八节主持词
2014/03/17 职场文书
酒店管理专业毕业生求职自荐信
2014/04/28 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫