题目:小科去了一家新的公司做前端主管,发现里面的前端代码有一部分是 C/C++ 程序员写的,他们喜欢用下划线命名,例如: is_good。小科决定写个脚本来全部替换掉这些变量名。
完成 toCamelCaseVar 函数,它可以接受一个字符串作为参数,可以把类似于 is_good 这样的变量名替换成 isGood。变量名首尾的下划线不需要做处理,中间的下划线全部删除并且处理成驼峰。
答案
我的答案一:
错误:处理 this_is_my_name 的返回结果不正确
const toCamelCaseVar = (variable) => {
variable=variable.toString()
let regc=/(_?[\w]+)(_)(\w*)/
variable=variable.replace(regc,($0,$1,$2,$3)=>{
let firstLetter=$3.slice(0,1)
$3=$3.substr(1)
firstLetter=firstLetter.toUpperCase()
let newWord=$1+firstLetter+$3
return newWord
})
}
查了半天replace的用法,replace第一个是参数是正则,第二个参数是一个函数,当正则中含有括号时,函数第一个参数为匹配到的字符串,$1,$2,$3分别对应正则中三个括号中子表达式匹配到的值,整体的思路就是取出$3首字母变成大写,丢掉$2代表的下划线。但是这个函数处理不了带多个下划线的字符串。
我的答案二:
错误:处理 this__is_my__name 的返回结果不正确
const toCamelCaseVar = (variable) => {
variable=variable.toString()
let regc=/(_[a-zA-Z]+)/g
variable=variable.replace(regc,(val,match,index)=>{
if(!match){ return val}
else{
if(index!=0) {
let firstLetter=match.slice(1,2)
firstLetter=firstLetter.toUpperCase()
match=firstLetter+match.substr(2)
return match
}
return match
}
})
return variable
}
在这里我更改了正则表达式,在全局搜索类似于_is,_has 之类的子字符串,在这里我对子字符串出现的位置index做了判断,如果_出现在首位,直接返回match,如果不在首位,截取字符串的第二位作为首字母(第一位是下划线_),变成大写之后重新返回子字符串。基本能用,但是这里我没有注意到有多条下划线的情况。
我的答案三:
终于正确了
const toCamelCaseVar = variable => {
variable = variable.toString();
let regc = /(_+[a-zA-Z]+)/g;
variable = variable.replace(regc, (val, match,index) => {
if (!match) {
return val;
} else {
if (index != 0) {
match = match.replace(/_/g, '');
let firstLetter = match.slice(0, 1);
firstLetter = firstLetter.toUpperCase();
match = firstLetter + match.substr(1);
return match;
}
return match;
}
});
return variable
};
此处把regc=/(_[a-zA-Z]+)/g
改成了regc=/(_+[a-zA-Z]+)/g
,然后使用replace函数对搜索到的子字符串match进行下划线批量删除。结果正确。
网上的最优答案:
const toCamelCaseVar = (variable) => {
return variable.replace(/_+[a-zA-Z]/g,(m, i) => {
if(i) return (m.match(/[a-zA-Z]/)[0].toUpperCase());
else return m;
})
}
我之前的思路是每次把整个子字符串取出来,比如_this_is_my_name,我会把它分解成[_this,_is,_my,_name],而最优答案的思路是每次只取出下划线和下划线后面一个字符,即生成[_t,_i,_m,_n],然后通过match方法返回大写的首字母,由于他的正则中没有括号,所以函数中没有子表达式参数,i直接对应index,当i=0时,即代表字符串首位的下划线,则直接返回搜索到的字符串m。这个最优答案非常简洁巧妙,有很大的借鉴意义。