如何分割无空格及非字母字符的字符串?驼峰转spinal case求助
如何将驼峰式字符串转换为脊柱式(kebab-case)字符串?
需求:将字符串"thisIsSpinalTap"转换为this-is-spinal-tap。
我尝试编写JavaScript代码实现该功能,思路是在大写字符前添加空格,但运行结果混乱,不知如何正确实现。以下是我尝试的代码:
function isUpper(str) { return str === str.toUpperCase(); } function spinalCase(str) { let s=str.split(''); let string=str.split(''); for(var i=0;i<str.split('').length;i++) { if(isUpper(string[i])) { string.splice(i-1, 0, " "); } console.log(string) } return str; } spinalCase('thisIsSpinalTap');
你的代码存在几个核心问题:
- 循环索引混乱:用原字符串长度作为循环上限,但
splice会修改数组长度,插入空格后后续字符索引偏移,导致部分字符无法被正确遍历。 - 返回错误结果:最后返回的是原始字符串
str,而非处理后的数组内容。 - 逻辑细节错误:
i=0时i-1=-1会把空格插入数组开头,不符合需求;且需求是用连字符-而非空格,最终还需转全小写。
推荐两种简单的实现方法:
方法一:正则表达式(最简洁)
匹配小写字母后跟大写字母的位置,插入连字符后统一转小写:
function spinalCase(str) { // 匹配小写+大写的组合,替换为「小写-大写」,再转全小写 return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); } // 测试 console.log(spinalCase('thisIsSpinalTap')); // 输出 "this-is-spinal-tap"
方法二:数组遍历(更直观)
遍历字符数组,遇到大写字母时在其前插入连字符,同时调整索引避免重复处理:
function isUpper(char) { return char === char.toUpperCase(); } function spinalCase(str) { const chars = str.split(''); // 从第2个字符开始遍历(第一个字符前无需加连字符) for (let i = 1; i < chars.length; i++) { if (isUpper(chars[i])) { chars.splice(i, 0, '-'); i++; // 插入连字符后,跳过该字符避免重复处理 } } return chars.join('').toLowerCase(); } // 测试 console.log(spinalCase('thisIsSpinalTap')); // 输出 "this-is-spinal-tap"
内容的提问来源于stack exchange,提问作者Boxstation YT
相关产品推荐
相关产品推荐

