javascript去重的各种版本

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

  1. 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;
    }
    
  2. 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引擎内部应该是用的快速排序吧。 最终测试的结果是此方法运行时间平均是第二种方法的三倍左右,不过比第一种和第三种方法快了不少。

时间: 2024-10-14 12:53:16

javascript去重的各种版本的相关文章

javascript判断手机浏览器版本信息

<script type="text/javascript"> /* * 智能机浏览器版本信息: * */ var browser={ versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return {//移动终端浏览器版本信息 trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto

JavaScript的名字和版本

语言标准版本名字:ECMAScript(ECMA是欧洲计算机制造协会,据说可能是专门做标准的,除了JavaScript遵循这个标准以外,还有XX....)    Jscript(IE对该语言实现版本的描述) ECMA1: ES3(ECMAScript3):所有web浏览器都实现.标志着 ECMAScript 成为一种真正的编程语言. ES4:挂了,没有发行过正式版 ES5:2009年 ES6:2015年 ES7:2016年 ES8:2017年 Mozilla网景公司的版本号:JavaScript

[转]JavaScript去重的6种方法

Array.prototype.unique1 = function() { var n = []; for(var i = 0; i < this.length; i++) { if (n.indexOf(this[i]) == -1) n.push(this[i]); } return n; } Array.prototype.unique2 = function() { var n = {},r=[]; for(var i = 0; i < this.length; i++) { if

JavaScript判断IE各版本最完美解决方案

判断是否是ie浏览器 http://qsfwy.iteye.com/blog/249968 判断ie版本 https://github.com/nioteam/jquery-plugins/issues/12

JavaScript判断IE各版本完美解决方案

解决方案 IE知道自身毛病很多,于是提供的一套官方的HTML hack方式: <!--[if IE]> // 全部IE版本可见 <![endif]--> <!--[if IE 6]> // IE6可见 <![endif]--> 依次等等.这样的写法在其它浏览器里,完全就是一坨注释而直接遭到无视,但在IE里却不会.IE会分析里面的提到的版本号,并根据版本号确定要不要解析里面的DOM元素和文本内容.等一下!DOM元素?那岂不是可以使用js来获取里面的DOM元素?

JavaScript 判断浏览器及版本

/* 智能机浏览器版本信息: alert("语言版本: "+iBrowser.language); alert(" 是否为移动终端: "+iBrowser.versions.mobile); alert(" ios终端: "+iBrowser.versions.ios); alert(" android终端: "+iBrowser.versions.android); alert(" 是否为iPhone: "

如何使用JavaScript和正则表达式进行数据验证

利用客户端JavaScript的优势,JavaScript中的正则表达式可以简化数据验证的工作,下面与大家分享下如何使用JavaScript和正则表达式进行数据验证,感兴趣的朋友可以参考下哈 数据验证是网络应用软件从客户端接受数据的重要步骤,毕竟,您需要在使用客户数据前确保其符合预期的格式.在网络应用程序中,您可以选择使用特定平台的工具,比如ASP.NET.JSP等等,或者您可以利用客户端JavaScript的优势,JavaScript中的正则表达式可以简化数据验证的工作. 正则表达式 正则表达

学习JavaScript中的异步Generator

本文和大家分享的主要是javascript中异步Generator相关内容,一起来看看吧,希望对大家学习javascript 有所帮助. 异步的generators和异步iteration已经到来 ! 这是错误的, 它们现在还在 阶段 3 ,这表示他们很有可能在JavaScript未来的一个版本中发布. 在他们发布之前,你可以通过 Babel 来在你的项目中使用还在阶段3的建议内容. 网站基本上还是一些分散运行的应用,因为任何在语言上的修改都会造成永久的影响,所以所有的未来的版本都需要向后兼容.

JavaScript DOM编程艺术学习笔记(一)

第一章 JavaScript简史 1.1 JavaScript的起源 JavaScript是Netscape公司和Sun公司合作开发的.JavaScript的第一个版本,即JavaScript1.0版本,出现在1995年推出的Netscape Navigator2浏览器中.JavaScript是一种脚本语言,通常只能通过Web浏览器去完成一些操作而不能像普通意义上的程序那样独立运行. 1.2 DOM 简单地说,DOM是一套对文档的内容进行抽象和概念化得方法. 1.3 浏览器战争 1.3.1 DH