前端面试题

转换驼峰命名(match与replace)

2019-03-28  本文已影响0人  千茉紫依

题目:小科去了一家新的公司做前端主管,发现里面的前端代码有一部分是 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。这个最优答案非常简洁巧妙,有很大的借鉴意义。

上一篇 下一篇

猜你喜欢

热点阅读