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入门·动态的时钟,显示完整的一些方法,新年倒计时
Oct 01 Javascript
包含中国城市的javascript对象实例
Aug 03 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
Aug 21 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
Dec 10 Javascript
js print打印网页指定区域内容的简单实例
Nov 01 Javascript
Bootstrap table两种分页示例
Dec 23 Javascript
利用node.js搭建简单web服务器的方法教程
Feb 20 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
Apr 13 Javascript
利用JavaScript的Map提升性能的方法详解
Aug 14 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
Jul 22 Javascript
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
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
JAVA/JSP学习系列之七
2006/10/09 PHP
使用PHP批量生成随机用户名
2008/07/10 PHP
PHP strtotime函数详解
2009/12/18 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
IE图片缓存document.execCommand(&quot;BackgroundImageCache&quot;,false,true)
2011/03/01 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
js实现购物车功能
2018/06/12 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
python3实现逐字输出的方法
2019/01/23 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
python 实现按对象传值
2019/12/26 Python
python list的index()和find()的实现
2020/11/16 Python
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
高中毕业的自我鉴定
2013/12/09 职场文书
晨会主持词
2014/03/17 职场文书
超市创业计划书
2014/09/15 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL