javascript练习题(3):基础字符串运算

时间:2023-02-24 00:22:09

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

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=/(?=(?!\b)(\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));

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

思路二:正则

```javascript
var a='afjasoeigjs123sgdh1edhhe456osddhnofd789';

function change(str){
var re=/\d+/g;
return str.match(re);
}

console.log(change(a));