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


      牛客网有一道题

      要求去除输入数组的重复项,有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"]

      这就去除了重复的对象

      // 8.31补充

    使用对象去除两个数组的重复项
    var arr = ["sina", "qq", "taobao", "jd", "baidu"]
    var obj = {}
        for (var i = 0; i < arr.length; i++) {
            var key = arr[i]
            obj[key] = 0
        }
    var arr2 = ["qq", "baidu", "baidu"];
        for (var i = 0; i < arr2.length; i++) {
            var key = arr2[i];
            obj[key]++
        }
    var res = []
        for (var i in obj) {
            if (obj[i] == 0) {
                res.push(i)
            }
        }
    console.log(res.sort())  // ["sina", "taobao", "jd"]
  • 相关阅读:
    Qt数据库应用13通用数据库分页
    Qt编写地图综合应用57跨平台(win、linux、mac、uos、kylin等)
    Qt编写可视化大屏电子看板系统24模块2当月计划
    Qt数据库应用11通用数据生成器
    Qt数据库应用12通用数据库清理
    Qt编写可视化大屏电子看板系统23模块1产量汇总
    Build your first app
    Migrate your app from Xamarin.Forms
    .NET MAUI Preview4 状态预览(5月)
    2021年总结
  • 原文地址:https://www.cnblogs.com/dirkhe/p/7399734.html
Copyright © 2020-2023  润新知