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

2017-01-09 19:17:38来源:cnblogs.com作者:葡萄美酒夜光杯人点击

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

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));


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台