在为字符串创建自定义regex-camelCase解决方案时,Javascript错误的结果

Javascript wrong outcome when crafting a custom regex camelCase solution for strings

本文关键字:Javascript 错误 结果 解决方案 字符串 创建 自定义 regex-camelCase      更新时间:2023-09-26

我正在尝试一个Javascript挑战,他的指令是:

 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.

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

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();
}

把它简化为怎么样

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>");

解释:

[-_]查找-_

(.?)跟在任何其他字符后面,并将该其他字符放在一个组中。

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

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

这会跳过前导字符,因为它之前没有-_

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