美文网首页前端面试题
转换驼峰命名(match与replace)

转换驼峰命名(match与replace)

作者: 千茉紫依 | 来源:发表于2019-03-28 21:22 被阅读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。这个最优答案非常简洁巧妙,有很大的借鉴意义。

    相关文章

      网友评论

        本文标题:转换驼峰命名(match与replace)

        本文链接:https://www.haomeiwen.com/subject/ijxhbqtx.html