zoukankan      html  css  js  c++  java
  • javascript练习题(3):基础字符串运算

    用两种方法实现下列问题!

    1. 把一个字符串转化为驼峰写法

    需求:margin-left=>marginLeft

    思路一:split

    把它转化为一个数组然后修改内容

    function convertStr(str){
        var arr=str.split('-');
        arr=arr.map(function(item){
            return item[0].toString().toUpperCase()+item.slice(1);
        });
    
        var newStr=arr.join('');
        newStr=newStr[0].toLowerCase()+newStr.slice(1);
        //console.log(newStr);
        return newStr;
    }
    
    convertStr('border-left-color');//borderLeftColor
    

    思路二:暴力拆解

    强行用循环暴力拆解

    function convertStr(str){
        var newStr='';
    
        for(var i=0;i<str.length;i++){
            if(str[i]!=='-'){
                if(str[i-1]&&str[i-1]=='-'){
                  newStr+='';
                }else{
                  newStr+=str[i];  
                }     
            }else{
                newStr+=str[i+1].toUpperCase();
            }
        }
        //console.log(newStr);
        return newStr;
    }
    
    
    convertStr('border-left-color');
    

    思路三:正则

    function convertStr(str){
        var re=/-(w)/g;//匹配横杠下的全部字符比如-b,-c
    
        return str.replace(re,function($0,$1){
            //$0表示整个字符串,$1表示正则内第一个括号的内容
            return $1.toUpperCase();
        });
    }
    
    console.log(convertStr('border-left-color'))
    

    正则的题目出不完,所以死记是没有用的。

    2. 查找字符串出现最多的字符和个数

    思路一 :暴力拆解(对象)

    不如构造一个对象?

    var a='isfaogjaa;fgagp[;jhbsolbsdfgbvsdfbdbd]';
    
    function findMost(str){
        var type={};
        for(var i=0;i<str.length;i++){
            if(type.hasOwnProperty(str[i])){
                type[str[i]]+=1;
            }else{
                type[str[i]]=1;
            }
        }
    
        type.getMost=['',0];
        
        for(attr in type){
            if(type[attr]>type.getMost[1]){
                type.getMost=[attr,type[attr]];
            }
        }
        //console.log(type.getMost[0]);
        return type.getMost;
    }
    
    
    findMost(a);//“b”
    

    通过对象进行判断。

    思路二:正则

    把字符串转为数组,进行排序。

    不必指定任何规则,因为已经排列好了。

    var a='isfaogjaa;fgagp[;jhbsolbsdfgbvsdfbdbd]';
    
    function findMost(str){
        var arr=str.split('');
        arr.sort();
        str=arr.join('');
        var re=/(w)1+/g;
        //表示重复1次的部分。
    
        var num=0;
        var value='';
        str.replace(re,function($0,$1){
            //console.log($0)//aaa,bbb,。。。就像一个循环
    
            if(num<$0.length){
                num=$0.length;
                value=$1;
            }
    
        });
        console.log([num,value]);
        return [num,value];
    }
    
    
    findMost(a);//“b”
    

    3. 给数字加千分符

    比如:10000=>10,000

    转化之后显然是一个字符串。

    思路一:暴力拆解

    这个拆解已经很暴力了。

    var a=8752317;
    
    function changeNum(num){
        var arr=num.toString().split('');
        var newArr=[];
        var head=num.toString().length%3;
        arr=arr.slice(head)
        for(var i=0;i<arr.length;i+=3){
            newArr.push(arr.slice(i,i+3).join().replace(/,/g,''));
        }
    
        var newStr='';
        if(num.toString().slice(0,head)){
            newStr=num.toString().slice(0,head)+','+newArr.toString();
        }
        
        console.log(newStr);
        return arr;
    }
    
    changeNum(a);
    

    思路二:正则

    实话说正则很难。要匹配位置,要从后匹配

    (?=)前项声明
    (?!)反前项声明
    

    比如/a(?=b)/g表示匹配的是字符串出现"ab"时,其中的a。反之,/a(?!b)/g匹配的是所有不为ab字符串中的a如果你不写前面的a,那么这个前项声明就是匹配位置。

    var a=8752317;
    
    function changeNum(num){
        var re=/(?=(d{3})+$)/g;
        //匹配规则:重复出现三次都是数字,最少一次,从后面开始($)
        return num.toString().replace(re,',')
    }
    
    console.log(changeNum(a));
    

    结果又有bug比如752317,转化结果是,752,317

    所以还得用反前项声明匹配边界。

        var re=/(?=(?!)(d{3})+$)/g;
    

    4. 返回一个只包含数字类型的数组

    比如afjasoeigjs123sgdhedhhe456osddhnofd789=>[123,456,789]

    思路一:暴力拆解

    var a='afjasoeigjs123sgdh1edhhe456osddhnofd789';
    
    function change(str){
    
        var arr=[];
        for(var i=0;i<str.length;i++){
            if(Number(str[i])){
                if(str[i-1]&&Number(str[i-1])){
    
                    arr.push(str[i])
                }else{
                    arr.push('/');
                    arr.push(str[i]); 
                }
                
            }
        }
    
        arr=arr.join().replace(/,/g,'').split('/');
        arr=arr.filter(function(a){
            return a!=false;
        });
        return arr
    }
    
    console.log(change(a));
    

    暴力拆解不是没有价值。在某些极端环境下,或许可以提供了某种思路。

    思路二:正则

    var a='afjasoeigjs123sgdh1edhhe456osddhnofd789';
    
    function change(str){
        var re=/d+/g;
        return str.match(re);
    }
    
    console.log(change(a));
  • 相关阅读:
    【笔记】机器学习
    【笔记】机器学习
    【NLP】暑假课作业3
    【NLP】暑假课作业1
    【笔记】机器学习
    【转】谈谈我对攻读计算机研究生的看法
    Android学习笔记-事件处理
    精读《C++ primer》学习笔记(第四至六章)
    那些年,当我还是个小白
    精读《C++ primer》学习笔记(第一至三章)
  • 原文地址:https://www.cnblogs.com/djtao/p/6265633.html
Copyright © 2011-2022 走看看