javaScript 之 数组去重

  1. 今天咱么分享下数组去重,这个问题基本每次面试都会被问到,那我们如何以压倒性的优势回答这个问题呢?
    • 老规矩,需求,分析需求
    • 需求:数组去重
    • 分析需求:没啥可分析的,这不废话吗。小尴尬一下子。
    • 回答问题是一门技术,咱们来分析下这种技术。
  2. 开撸
    • 开胃菜,首先你第一种应该说的方式就是,硬去重,你说完这种方式,面试官会觉得你很low
       var arr = [1,1,'a','a']
       Array.prototype.unique = function () {
           var res = []
           //先把数组的长度缓存出来,好处就不扯了
           var len = this.length
           for (var i = 0; i < len; i++) {
               //的到缓存数组的长度
               var tempLen = temp.length
               for (var j = 0; j < tempLen; j++) {
                   if (this[i] === temp[j]) {
                       break;
                   }
               }
               if (j === tempLen) {
                   temp.push(this[i])
    
               }
           }
           return res
       }
    </script>
    
    • 当你写出这样的数组去重,面试官小哥哥,肯定是不太满意的哦,来一句,还有其他办法吗?
    • 莫慌莫慌有...利用es5给我们提供的filter方法
      Array.prototype.unique = function () {
             var self = this
             var res = this.filter((item, index) => this.indexOf(item) === index)
             return res;
     }
     console.log(arr.unique())
    
    • 这个时候面试官小哥哥,对你的好感会上升一点点哦,在来一句,还有其他办法吗?
    • 莫慌,莫慌,有...利用 reduce 方法也是可以数组去重的
     Array.prototype.unique = function () {
         var res = this.sort().reduce((pre, current) => {
             if (pre.length === 0 || pre[pre.length - 1] !== current) {
                 pre.push(current);
             }
             return pre;
         }, [])
         return res
     }
     console.log(arr.unique())
    
    • 默默的秀了一下子,接着不要等小哥问你了呗,其实上边的方法虽都能达到去重的目的,但是算法时间复杂度都是一样的,都不是太好
    • 我们可以利用完全hash的算法,利用对象的属性都是唯一的这个特性来实现数组去重
    Array.prototype.unique = function(){
         var temp = {}
         var res = []
         var len = this.length
         for(var i = 0; i < this.length; i++){
             if(temp[this[i]] == undefined){
                 temp[this[i]] = "abc" 
                 res.push(this[i])
             }
         }
         return res
     }
    
    • 渐入佳境了,再来一种,es6为我们提供了set这种数据结构,我们可以用它来实现数组去重
      Array.prototype.unique = function(){
          return Array.from(new Set(this));
      }
    
    • 还有几种方法,不一一列举了。
  3. 最后在升华一下子,其实上边的这些数组去重是有问题的,比如数组的元素中,有那种特殊的元素,比如 undefined,null,NaN(这玩意自己不等于自己)这样的就不能达到完全去重的目的。这里就不一一试了,拿怎么办呢?
    -记住,脱离了业务场景的技术都是耍流氓,根据自己的数据结构,在合适的场景要选择合适的方法。
  4. 这就是今天的数组去重,如果有错误或者不严谨的地方,希望大家给予指正,十分感谢。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,034评论 0 2
  • 讲在前面 这次选的计划是源码阅读计划,因为之前花时间x重新再过了高程和权威,觉得得看一些实在的东西来提高自己。因此...
    临水照影233阅读 313评论 0 0
  • 1.阅读二字不仅仅只是指阅读书籍,可以阅读的载体有很多,包括阅读人,物品,文章,风景,与朋友交谈….这些都是我们可...
    大彤_42c2阅读 254评论 0 1
  • 我蒙住了双眼,只想记住最后看你的那一眼。我刺瞎自己的双眼,只为记住那逝去的红颜——李青 短剑重铸之日骑士重归之时—...
    ling笑阅读 4,418评论 0 5
  • 相信现在大家看文章都有这样的感觉,评论远比文章好看,真的,有时候觉得有的评论简直一个个都是戏精啊,无论是幽默反转、...
    a40ea655c8eb阅读 932评论 0 0