为何toUpperCase()会将空格识别为匹配项?spinal case转换代码疑问
你的问题出在判断条件上——空格的toUpperCase()结果还是空格,所以newStr[i] === newStr[i].toUpperCase()这个条件对空格来说也成立,自然会把空格当成大写字母替换成-。
要解决这个问题,首先得先判断当前字符是大写字母,而不是只要等于自身大写就处理。另外你的逻辑还存在两个漏洞:第一个字符如果是大写会被替换成-,导致结果开头多符号;同时没处理转小写和其他分隔符(比如下划线)的情况。
给你两种修正方案:
方案一:修复原有循环逻辑
function spinalCase(str) { let newStr = str.split(""); for (let i = 0; i < newStr.length; i++) { // 只匹配大写字母,且不是第一个字符 if (newStr[i].match(/[A-Z]/) && i !== 0) { // 在大写字母前插入-,并把大写字母转小写 newStr.splice(i, 1, "-", newStr[i].toLowerCase()); // 插入字符后索引跳一位,避免重复处理 i++; } else if (newStr[i].match(/[A-Z]/)) { // 第一个字符是大写,直接转小写 newStr[i] = newStr[i].toLowerCase(); } else if (newStr[i] === " " || newStr[i] === "_") { // 把空格或下划线替换成- newStr[i] = "-"; } } return newStr.join(""); } console.log(spinalCase('This Is Spinal Tap')); // 输出 "this-is-spinal-tap"
方案二:用正则简洁实现
正则可以一次性处理所有分隔符和大写字母的情况:
function spinalCase(str) { return str .replace(/(^[A-Z])|[\s_]|([A-Z])/g, (match, firstCap, upperCase) => { if (firstCap) return firstCap.toLowerCase(); if (upperCase) return "-" + upperCase.toLowerCase(); return "-"; }); } console.log(spinalCase('This Is Spinal Tap')); // 输出 "this-is-spinal-tap"
内容的提问来源于stack exchange,提问作者user20762759
相关产品推荐
相关产品推荐

