我被困在这个编码挑战中 Spinal Tap Case来自freeCodeCamp。本质上,我不知道如何执行最后一次检查。
这是最后一次检查:spinalCase("AllThe-small Things") should return "all-the-small-things"
这是我的代码:
function spinalCase(str) {
var outputString,
newstr,
pattern1 = new RegExp(/[_\s]/, 'g'),
pattern2 = new RegExp(/(?=[A-Z])/, 'g'),
stringTest1 = pattern1.test(str),
stringTest2 = pattern2.test(str);
if(stringTest1) {
outputString = str.replace(pattern1, '-');
newstr = outputString.toLowerCase();
} else if(stringTest2) {
str.split(/(?=[A-Z])/).join(' ');
outputString = str.replace(pattern2, '-');
newstr = outputString.toLowerCase();
} else if (stringTest1 && stringTest2){
outputString = str.replace(pattern1, '-');
outputString = str.replace(pattern2, '-');
newstr = outputString.toLowerCase();
}
return newstr;
}
我确实意识到最后一个
else if
条件应该先行,但是我没有正确理解语法。提前致谢!
最佳答案
以下是我推荐的做法:
function sp(str) {
var spinal = str.replace(/(?!^)([A-Z])/g, ' $1')
.replace(/[_\s]+(?=[a-zA-Z])/g, '-').toLowerCase();
return spinal
}
JsBin Example
就您的代码而言,您检查:
如果
test1
else if test2
,然后 else if test1 and test2
,逻辑不正确:您可以尝试添加
!test2
或 !test1
第一个 if 检查以使其正常工作:if (stringTest1 && !stringTest2)...
编辑:
这里是你如何让你的代码在最后一个 else 中触发的方法,如果我在其中放了一个 console.log 来向你展示:
JSBin Example
function spinalCase(str) {
var outputString,
newstr,
pattern1 = new RegExp(/[_\s]/, 'g'),
pattern2 = new RegExp(/(?=[A-Z])/, 'g'),
stringTest1 = pattern1.test(str),
stringTest2 = pattern2.test(str);
if(stringTest1 && !stringTest2) {
outputString = str.replace(pattern1, '-');
newstr = outputString.toLowerCase();
} else if(!stringTest1 && stringTest1) {
str.split(/(?=[A-Z])/).join(' ');
outputString = str.replace(pattern2, '-');
newstr = outputString.toLowerCase();
} else if (stringTest1 && stringTest2){
console.log('were in the last else!!!');
outputString = str.replace(pattern1, '-');
outputString = str.replace(pattern2, '-');
newstr = outputString.toLowerCase();
}
return newstr;
}
关于javascript - 如何在 Javascript 中将字符串转换为脊柱大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36658624/