zoukankan      html  css  js  c++  java
  • js小题目(持续更新)

    总是感觉之前做过的问题很久没碰的话就会忘掉,于是打算专门开一个记录小题目的随笔当题典用。

    目录

    五种主要数据类型进行值复制
    数组去重
    数组去重并计数


    实现clone()方法,对五种主要数据类型进行值复制

    Object、Array、Boolean、Number、String

    分为三种情况:普通变量,Array,Object

    因为array和object里也可能包含引用类型,所以递归调用

    function clone(obj){
        var copy;
        if(obj instanceof Array){
            copy=[];//用空数组来一个一个接收数据
            obj.forEach(function(value,index){
                copy[index] = clone(obj[index]);
            })
            return copy;
        }else if(obj instanceof Object){
            copy = {};//用空对象来一个一个接收数据
            for(var i in obj){
                copy[i]=clone(obj[i]);
            }
            return copy;
        }else{//值类型直接赋值
            return obj;
        }
    }
    

    数组去重

    Array.prototype.delRepeat = function() {
        var res = [];//创建一个新的数组存放结果
        var json = {};//创建一个空对象
        for(var i = 0; i < this.length; i++) {//每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复
            if(!json[this[i]]) {
    		res.push(this[i]);
    		json[this[i]] = 1;
    	    }
        }
        return res;
    }
    
    var arr = [12, 13, 3, 'haha', 13, 12, 4, 'haha', 'hi', 'hihi'];
    alert(arr.delRepeat());
    

    不过这样有个很大的问题,就是字符串 '123' 和 数值123 会被当作相同元素被跳过。

    于是可以做如下的修改:

    Array.prototype.delRepeat = function() {
        var res = [];//创建一个新的数组存放结果
        var json = {};//创建一个空对象
        var strFlag = '';//判断是否为字符串的标记
        for(var i = 0; i < this.length; i++) {//每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复
            if(typeof this[i] == 'string' ) {  
                strFlag = 'str_';  
            } else {  
                strFlag = '';  
            } 
            if(!json[strFlag+this[i]]) {
    	    res.push(this[i]);
    	    json[strFlag+this[i]] = 1;
            }
        }
        return res;
    }
    
    var arr = [12, 13, 3, 'haha', 13, '12', 4, 'haha', 'hi', 'hihi'];
    alert(arr.delRepeat());
    

    数组去重并计数

    统计数组["番茄炒蛋","泡椒牛柳","香干肉丝","番茄炒蛋","香干肉丝","蜜汁鸡腿"]中各个菜的个数。

    function test(arr) {
        var hash = {};
        var str = arr.toString();
        str.replace(/[u4E00-u9FA5uF900-uFA2D]+/g, function($1) {//正则是匹配中文(包括了中日韩文)
        if($1 in hash)
            hash[$1]++;
        else
            hash[$1] = 1;
        });
        return hash;
    }
    var arr = ["番茄炒蛋","泡椒牛柳","香干肉丝","番茄炒蛋","香干肉丝","蜜汁鸡腿"];
    console.log(test(arr));
    

    具体的匹配中文及字符方法:/[u4E00-u9FA5uF900-uFA2D]/
    说明:
    u4e00-u9fbf : unicode CJK(中日韩)统一表意字符。u9fa5后至u9fbf为空
    uF900-uFAFF : 为unicode CJK 兼容象形文字 。uFA2D后至uFAFF为空

  • 相关阅读:
    ffmpeg处理RTMP流媒体的命令大全
    人像摄影技巧——镜头差异可改变脸部印象
    windows操作系统自带的TCP端口转发
    IIS7.5如何限制某UserAgent 禁止访问
    JS显示上一周
    mysql主从复制(超简单)
    0001-BUGIFX-Magento-Zend-Framework-1-PHP5.6.patch
    Nginx启用Gzip压缩js无效的原因
    开启Nginx的gzip压缩功能详解
    Python 中的垃圾回收机制
  • 原文地址:https://www.cnblogs.com/macq/p/6559262.html
Copyright © 2011-2022 走看看