在为字符串制作自定义正则表达式camelCase解决方案时,Javascript错误的结果

时间:2015-08-17 23:02:42

标签: javascript regex string replace ternary-operator

我正在尝试Javascript挑战他们的指示是:<​​/ p>

 Complete the method/function so that it converts dash/underscore delimited 
 words into camel casing. The first word within the output should be    
 capitalized only if the original word was capitalized.

Examples:
toCamelCase("the-stealth-warrior")
// returns "theStealthWarrior"

toCamelCase("The_Stealth_Warrior")
// returns "TheStealthWarrior"

我的解决方案是:

function toCamelCase(str) {
  console.log(str);
  var camel = str.replace(/(?:^\w|[A-Z]|-\w|_\w)/g, function(letter, index) {
    return index === 0 && letter === letter.toLowercase  ? 
  letter.toLowercase : letter.toUpperCase();
  }).replace(/(-|_)/g, "");
  console.log(camel);
  return camel;
}

以及在测试用例中使用我的代码时的输出是:

toCamelCase('the_stealth_warrior') did not return correct value - 
Expected: theStealthWarrior, instead got: TheStealthWarrior

出现问题的任何想法?我觉得三元运算符中的条件应该返回小写t。

2 个答案:

答案 0 :(得分:3)

此处的这段代码导致了您的问题:

function(letter, index) {
    return index === 0 && letter === letter.toLowercase  ? 
        letter.toLowercase : letter.toUpperCase();
}

您可能打算使用toLowerCase(),但您提供了对letter不存在的属性的引用。由于toLowercase不存在,它将返回undefined,这将导致您的条件总是返回false。

将行更改为:

function(letter, index) {
    return index === 0 && letter === letter.toLowerCase()  ? 
        letter.toLowerCase() : letter.toUpperCase();
}

答案 1 :(得分:2)

如何简化它:

&#13;
&#13;
function toCamelCase(str) {
    return str.replace(/[-_](.?)/g, function(match, p1) {
        return p1.toUpperCase();
    })
}

document.write(toCamelCase("the-stealth-warrior") + "<br>");


document.write(toCamelCase("The_Stealth_Warrior")  + "<br>");
&#13;
&#13;
&#13;

<强>解释

[-_]找到-_

(.?)跟随任何其他角色并将此其他角色放在一个组中。

然后使用.replace()标志使用自定义回调调用g来执行所有匹配。

自定义回调将作为第一个参数传递完整匹配,并将匹配中的任何组作为后续参数传递。由于我们想要将其转换为第一组的大写版本,我们只需用return p1.toUpperCase()大写第二个参数,然后将整个匹配替换为第一个匹配组的大写版本。然后,这会将_x转换为X

这会跳过主角,因为之前没有-_

这会跳过任何尾随-_,因为之后没有任何字符。