美文网首页
javaScript 之 数组去重

javaScript 之 数组去重

作者: Nothinglefttosa | 来源:发表于2018-10-25 23:58 被阅读0次
    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. 这就是今天的数组去重,如果有错误或者不严谨的地方,希望大家给予指正,十分感谢。

    相关文章

      网友评论

          本文标题:javaScript 之 数组去重

          本文链接:https://www.haomeiwen.com/subject/jexhtqtx.html