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制作的鼠标悬浮时产生的下拉框效果
Oct 27 Javascript
给文字加上着重号的JS代码
Nov 12 Javascript
js实现的牛顿摆效果
Mar 31 Javascript
javascript中new关键字详解
Dec 14 Javascript
原生js实现移动端瀑布流式代码示例
Dec 18 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
Mar 11 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
Apr 04 jQuery
Angular directive递归实现目录树结构代码实例
May 05 Javascript
JS实现简单拖拽效果
Jun 21 Javascript
Vue.directive使用注意(小结)
Aug 31 Javascript
微信小程序Echarts覆盖正常组件问题解决
Jul 13 Javascript
antd form表单数据回显操作
Nov 02 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使用者状态管理功能的应用
2006/10/09 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
Python中eval带来的潜在风险代码分析
2017/12/11 Python
python中使用print输出中文的方法
2018/07/16 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
pycharm创建一个python包方法图解
2019/04/10 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
python实现梯度下降法
2020/03/24 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
师范教师毕业鉴定
2014/01/13 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
赔偿协议书
2015/01/27 职场文书
2015年材料员工作总结
2015/04/30 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
源码安装apache脚本部署过程详解
2022/09/23 Servers