码迷,mamicode.com
首页 > 编程语言 > 详细

刷题 | 数组去重的4种方法引发的思考

时间:2017-08-20 14:08:27      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:测试   object   als   ons   res   重复   prototype   push   length   

  牛客网有一道题

技术分享

  要求去除输入数组的重复项,有bool undefined null NaN number object string 几乎所有数据类型

  但是去重的时候,不要求去除object "{}" 这个考点有两个 一个indexOf  和   NaN!==NaN

  这种去重,有三种解决方案

  使用indexOf

  原代码  

Array.prototype.check = function(){
        var res =[];
        var flag = true;
        for(var i=0;i<this.length;i++){
            if (res.indexOf(this[i])== -1) {
                if (this[i]!=this[i]) {
                    if (flag===true) {
                        res.push(this[i]);
                        flag=false;
                    }

                }else{
                    res.push(this[i]);
                }
                    
            }
                return res;
    
}    

  测试代码

var arr = [false, true, undefined, null, NaN, 0, 1, {}, {}, ‘a‘, ‘a‘, NaN];
    console.log(arr.check());    //[false, true, undefined, null, 0, 1, Object, Object, "a"]

   判断res数组的值是否首次出现的位置  没有首次出现则返回-1 过滤掉NaN

  使用ES6的Set去重
var set = new Set(this);
return Array.from(set);
  使用高阶函数filter去重
var r =this.filter(function(element,index,self){
             return self.indexOf(element)===index;
        })
        return r;

  但是这三种去重都无法去除重复的Object

  使用对象的key值去重
     var arr=[];
        var obj = {};
         for(var i=0;i<this.length;i++){
             if(!obj[this[i]]){
                 obj[this[i]]=1;
                arr.push(this[i])
                
             }
        }
         return arr; // [false, true, undefined, null, NaN, 0, 1, Object, "a"]

  这就去除了重复的对象

刷题 | 数组去重的4种方法引发的思考

标签:测试   object   als   ons   res   重复   prototype   push   length   

原文地址:http://www.cnblogs.com/dirkhe/p/7399734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!