您当前位置:首页 > 文章中心 > SCSCMS

js数组去重

稿件来源: 阳光企业网站管理系统   撰稿作者: 太阳光   发表日期: 2014-04-23   阅读次数: 247   查看权限: 游客查看

javascript数组去重方法

今天有Q友去面试,其中一个考察点就是js数组去重问题。网上随手也可以抓到大堆方法:

Array.prototype.unique1 = function () {
    var r = [], n = this.length;
    label:for(var i = 0; i < n; i++) {
        for(var x = 0, y = r.length; x < y; x++) {
            if(r[x] == this[i]) {
                continue label;
            }
        }
        r[r.length] = this[i];
    }
    return r;
};

此方法是循环数组,把不相同的字符放入一个临时数组。判断不相同的方法就是取数组字符去临时数组里一个个核对。

Array.prototype.unique2 = function() {
    var res = [], hash = {};
    for(var i=0, elem; (elem = this[i]) != null; i++)  {
        if (!hash[elem]){
            res.push(elem);
            hash[elem] = true;
        }
    }
    return res;
};

此法与上面方法类似,只不过是建了一个临时对象来储存。

Array.prototype.unique3 = function() {
    var temp = {}, len = this.length,tempArr=[],i;
    for(i=0; i < len; i++)  {
        if(!temp.hasOwnProperty(this[i])) {
            temp[this[i]] = 1;
        }
    }
    len = 0;
    for(var k in temp) {
        tempArr[len++] = k;
    }
    return tempArr;
};

此法又跟上面方法类似,只不过是使用hasOwnProperty属性来去重。由不同的数组组成一个对象,再由对象转成数组。

Array.prototype.unique4 = function () {
    var temp = [];
    this.sort();
    for(var i = 0; i < this.length; i++) {
        if( this[i] == this[i+1]) {
            continue;
        }
        temp[temp.length]=this[i];
    }
    return temp;
};

些法使用了一点小技巧,先把数组排序一下,然后紧临的两个数组依次对比判断是否重复。但是sort未必会提升效率哦。

Array.prototype.unique5 = function () {
    return this.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
};

这个使用正侧方法,说实在难懂又麻烦,因为使用了三次replace。还不如自己写个简单的正侧:

Array.prototype.unique6 = function () {
    return this.join(";").match(/([^;])(?=;|$)(?!.*\1)/g);
};

把数组转成字符,以;号连接,然后提取出现一次的字符出来。

到此也许你会说好多方法可以实现哦,正得意!但我告诉你他们都有大大的bug。如果以上方法只去重纯数字或者纯字符串的数组没有问题。但是如果去重数字和字符串混合的就有问题了。比如["a",1,"1",2,"b","2"]。因在javascript中1=="1"是成立的。

Array.prototype.unique7 = function(){
    return this.filter(function(a,b,c){
        return c.indexOf(a) == b;
    })
};

这方法好呀,利用filter方法即简单又可解决数字比较字符串的bug!等等……仍有bug呀,比如["a",1,"1",2,"b",NaN,NaN]。注意NaN!=NaN哦,只能出最后一招了:

Array.prototype.unique8 = function(){
    var p = {"boolean":{}, "number":{}, "string":{}}, obj = [];
    return this.filter(function (x) {
        var t = typeof x;
        return (t in p) ? !p[t][x] && (p[t][x] = 1) : obj.indexOf(x) < 0 && obj.push(x);
    });
};

最新ES6 set去重法(推荐):

    Array.prototype.unique9 = function(){
        return Array.from(new Set(this));
    };

 

关键词: javascript,数组,去重复   编辑时间: 2018-04-10 9:57:36

  • 感到高兴

    0

    高兴
  • 感到支持

    0

    支持
  • 感到搞笑

    0

    搞笑
  • 感到不解

    0

    不解
  • 感到谎言

    0

    谎言
  • 感到枪稿

    0

    枪稿
  • 感到震惊

    0

    震惊
  • 感到无奈

    0

    无奈
  • 感到无聊

    0

    无聊
  • 感到反对

    0

    反对
  • 感到愤怒

    0

    愤怒
0%(0)
0%(0)
共有0 条评论 发言请遵守【相关规定

网友评论

会员头像
发 表同步腾讯微博    验证码:  点击更新请先登陆
  • 暂无评论
关闭模块文章图片 article Pictrue
  • 我的妈妈爸爸
  • 基于koa2+mysql+vue2.0+Element阳光内容管理系统
  • 代码覆盖率工具 Istanbul 入门教程
  • 全栈工程师的武器——MEAN
  • 9款超炫的 CSS3 复选框(Checkbox)
  • 微信开发在线翻译功能
  • CSS3那些不为人知的高级属性
  • 给easyui的datebox添加清空事件
  • flash写字效果
  • kendoUI系列教程之DropDownList下拉菜单
  • kendoUI系列教程之datetimepicker日期时间选择
  • kendoUI系列教程之datepicker日期选择
  • kendoUI系列教程之combobox下拉列表框
  • kendoUI系列教程之colorpicker
  • kendoUI系列教程之calendar日历表
  • kendoUI系列教程之autocomplete自动补齐