我试图添加" - "在大写字母之前。例如helloWorld成为你好世界。
然而,我的代码是放置" - "在数组中的错误位置。 即thisIsSpinalTap成为this-I-sSpin-alTap
我的代码出了什么问题?
function spinalCase(str){
str = str.replace(/ /g,'-');
strArr = str.split("");
for(i=1;i<str.length;i++){
if(str.charAt(i)==str.charAt(i).toUpperCase()&&str.charAt(i)!=="-"){
console.log(i);
strArr.splice(i,0,"-");
}
}
return strArr.join("");
}
spinalCase('thisIsSpinalTap'); // returns this-I-sSpin-alTap
答案 0 :(得分:3)
每次进行拼接时,strArr
漂移到左边是错误的。理想情况下,你应该保留另一个从0开始的计数器,并在你进行另一次拼接时增加,例如:
var k = 0;
// ...
strArr.splice(i + k, 0, '-');
++k;
假设您不仅仅是这样做,这是一种更容易的方法:
var s = 'thisIsSpinalTap';
var res = s.replace(/([a-z])([A-Z])/g, '$1-$2'); // "this-Is-Spinal-Tap"
表达式匹配小写字母后跟一个大写字母,然后用中间的短划线替换它。
答案 1 :(得分:1)
这里的问题是你是在循环中修改数组,但是你正在使用字符串检查字符,而字符串没有根据数组中发生的新字符插入进行更新,所以当-
是插入字符串中的索引将比数组的索引少1,这就是-
插入的位置比第二个实例中所需的位置少1个位置。每次插入都会继续使用相同的模式,因此第3次插入将在postion-2
function spinalCase(str) {
str = str.replace(/ /g, '-');
var strArr = str.split(""),
i, code;
for (i = 1; i < str.length; i++) {
//since we are modifying the array the indexes in the original array can't be used
code = strArr[i].charCodeAt(0);
if (code >= 65 && code <= 90) {
strArr.splice(i, 0, "-");
//since we are inserting a new element before current element we need to skip an extra element
i++;
}
}
return strArr.join("");
}
var result = spinalCase('thisIsSpinalTap');
snippet.log(result)
&#13;
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;