我正在尝试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。
答案 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)
如何简化它:
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;
<强>解释强>
[-_]
找到-
或_
(.?)
跟随任何其他角色并将此其他角色放在一个组中。
然后使用.replace()
标志使用自定义回调调用g
来执行所有匹配。
自定义回调将作为第一个参数传递完整匹配,并将匹配中的任何组作为后续参数传递。由于我们想要将其转换为第一组的大写版本,我们只需用return p1.toUpperCase()
大写第二个参数,然后将整个匹配替换为第一个匹配组的大写版本。然后,这会将_x
转换为X
。
这会跳过主角,因为之前没有-
或_
。
这会跳过任何尾随-
或_
,因为之后没有任何字符。