javaScript 之 数组去重

2018-10-25  本文已影响0人  Nothinglefttosa
  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. 这就是今天的数组去重,如果有错误或者不严谨的地方,希望大家给予指正,十分感谢。
上一篇下一篇

猜你喜欢

热点阅读