#29 转换驼峰命名


  • 0
    administrators

    小科去了一家新的公司做前端主管,发现里面的前端代码有一部分是 C/C++ 程序员写的,他们喜欢用下划线命名,例如: is_good。小科决定写个脚本来全部替换掉这些变量名。

    完成 toCamelCaseVar 函数,它可以接受一个字符串作为参数,可以把类似于 is_good 这样的变量名替换成 isGood

    变量名首尾的下划线不需要做处理,中间的下划线全部删除并且处理成驼峰。


  • 0

    0_1494847872639_upload-6d2c5f13-d0cc-481d-9dcb-f16e86c96f8d
    我在本地测试输出是这个:0_1494847926797_upload-62cbd144-7ba6-4b05-9206-335f57349662
    哪里有问题?


  • 2
    管理员

    分享一下代码:

    const toCamelCaseVar = (variable) => /* TODO */
    {
      return variable.replace(/_+[a-zA-Z]/g,(m, i) => {
      	if(i) return (m.match(/[a-zA-Z]/)[0].toUpperCase());
      	else return m;
      })
    }
    

  • 0
    管理员

    @maroon 看一下返回结果是不是thisIsMyName,不符合这个格式都会报错的


  • 0

    @陈小俊 那个题我后来发现啦,是我匹配的时候没注意前面的下划线和末尾的下划线保留,


  • 0

    一行解决系列

    const toCamelCaseVar = variable => variable.replace(/([^_])(?:_+(\S))/g, (_, f, p) => f + p.toUpperCase())
    

  • 0

    @CodeHz 兄弟能解释一下嘛


  • 0

    @PARADISELIN 正则表达式匹配两个组,对应就是f,p两个参数,详情可以参考mdn上的replace介绍


  • 0

    variable.replace(/(^_+)|(_+\S)/g, (match) => match[match.length-1] === '_' ? match : match[match.length-1].toUpperCase())
    

  • 0

    @CodeHz 感觉匹配尾部的下划线会有问题,举个栗子:

    const toCamelCaseVar = variable => variable.replace(/([^_])(?:_+(\S))/g, (_, f, p) => f + p.toUpperCase())
    const varName = '__aaa__bbb_ccc__';  // <- 尾部有两个下划线
    console.log(toCamelCaseVar(varName)); // __aaaBbbCcc_ <- 只剩下一个下划线
    

    改成如下的正则式是否会更合理一些?

    const toCamelCaseVar = variable => variable.replace(/([^_])(?:_+([^_]))/g, (_, f, p) => f + p.toUpperCase())
    const varName = '__aaa__bbb_ccc__';  // <- 尾部有两个下划线
    console.log(toCamelCaseVar(varName)); // __aaaBbbCcc__
    

  • 0

    遇见正则的就一脸懵逼了


  • 0

    处理 _$this_is_my_name 的返回结果不正确
    返回$thisIsMyName也不对吗?


  • 0
    administrators

    @裂章

    变量名首尾的下划线不需要做处理,中间的下划线全部删除并且处理成驼峰。


  • 0

    const toCamelCaseVar = (variable) => {
      let underlineStart = variable.match(/^_+/g) ? variable.match(/^_+/g)[0] : '';
      var output = variable.replace(/(_+)([a-z$A-Z]+)/g, (match, p1, p2) => {
        return p2.toUpperCase()[0] + p2.slice(1);
      })
      return underlineStart + output.toLowerCase()[0] + output.slice(1);
    }
    

    感觉自己写复杂了


  • 0

    const toCamelCaseVar = s => s.replace(/([^])+(.)/g, (_, p, n) => p + n.toUpperCase())


  • 0

    var toCamelCaseVar = function (str){
    return str.replace(/([^]+)+(\S)/g,function(match,$1,$2,string){
    return $1+$2.toUpperCase()
    })
    }


  • 0

    比较长的一行代码

    const toCamelCaseVar = (v) => (/^_+/.exec(v) ? /^_+/.exec(v)[0] : '') + v.replace(/(^_+)|(_+$)/g,'').replace(/_+[\w$]/g,x=>x[x.length-1].toUpperCase())+ (/_+$/.exec(v) ? /_+$/.exec(v)[0] : '')
    

  • 0

    ‘this_is_my_name’在控制台输出'thisIsMyName',但是提交报错了啊。怎么回事!
    0_1512446512822_upload-0b6babe9-59a4-40c3-9174-aa17080cb29a


登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待