如何在 JavaScript 中将字符串转换为脊柱案例?

Ant*_*tiz 6 javascript regex str-replace

我被freeCodeCamp的这个编码挑战Spinal Tap Case困住了。基本上我不知道如何执行最后一次检查。

这是最后一次检查: 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;

}
Run Code Online (Sandbox Code Playgroud)

我确实意识到最后一个else if条件应该先行,但是我没有得到正确的语法。

提前致谢!

Jor*_*rix 5

以下是我推荐的做法:

function sp(str) {
  var spinal = str.replace(/(?!^)([A-Z])/g, ' $1')
                .replace(/[_\s]+(?=[a-zA-Z])/g, '-').toLowerCase();
  return spinal 
}
Run Code Online (Sandbox Code Playgroud)

JsBin 示例

至于你的代码,你检查:

如果test1 else if test2,则else if test1 and test2,逻辑不正确:

您可以尝试将 a!test2或添加!test1到第一个 if 检查以使其正常工作:

if (stringTest1 && !stringTest2)...
Run Code Online (Sandbox Code Playgroud)

编辑:

下面是如何让你的代码在最后一个 else 中触发,如果我在那里放了一个 console.log 来向你展示:

JSBin 示例

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;

}
Run Code Online (Sandbox Code Playgroud)