我一直在尝试用 JavaScript 解决这个 codewars 问题:
“完成解决方案,以便该函数将使用单词之间的空格来分解驼峰式大小写。示例:”
"camelCasing" => "camel Casing"
"identifier" => "identifier"
"" => ""
我几乎一直都有它,但由于某种原因,我的代码选择了错误的空间来添加空格。 我希望有人能告诉我我做错了什么。
function solution(string) {
let splitStr = string.split("");
let newStr = string.split("");
let capStr = string.toUpperCase().split("");
for (i = 0; i < splitStr.length; i++) {
if (splitStr[i] === capStr[i]) {
newStr.splice(i, 0, ' ');
}
}
return newStr.join("");
}
console.log('camelCasing: ', solution('camelCasing'));
console.log('camelCasingTest: ', solution('camelCasingTest'));
第一次插入
newStr
将位于正确的位置,但在插入空格之后,newStr
中紧随其后的字母将处于增加的索引处。这意味着,当在 i
(未更改)中的 splitStr
找到下一个大写字母时,插入到 newStr
(确实更改)实际上应该位于 i+1
。
解决方案是让循环从头到尾迭代:
function solution(string) {
let splitStr = string.split("");
let newStr = string.split("");
let capStr = string.toUpperCase().split("");
for (i = splitStr.length - 1; i >= 0; i--) {
if (splitStr[i] === capStr[i]) {
newStr.splice(i, 0, ' ');
}
}
return newStr.join("");
}
console.log('camelCasing: ', solution('camelCasing'));
console.log('camelCasingTest: ', solution('camelCasingTest'));
然而,使用正则表达式更容易解决此类问题:
function solution(string) {
return string.replace(/[A-Z]/g, " $&");
}
console.log('camelCasing: ', solution('camelCasing'));
console.log('camelCasingTest: ', solution('camelCasingTest'));
正则表达式解释:
[A-Z]
拉丁字母中的大写字母。$&
反向引用匹配的字母,用于替换。g
全局标志,因此所有匹配项都会被替换。这可能是一个带有简单循环和一些 if 条件的解决方案
const breakCamelCase = (word) => {
let result = "";
// loop on letter
for (let letter of word) {
// if letter is uppercase and not the first letter of the word add a space followed by the letter
if (letter == letter.toUpperCase() && result) {
result += ` ${letter}`;
} else { // else just add the letter
result += letter;
}
}
return result;
}
function solution(string) {
let splitStr = string.split("");
let newStr = "";
splitStr.forEach(e =>{
if(e === e.toUpperCase()) newStr +=" "+e;
else newStr += e;
});
return newStr;
}
console.log(solution('camelCasing'));//success = "camel Casing"
console.log(solution('camelCasingTest'));
我想出了这个:
function solution(string) {
let str = "";
for (let i = 0; i < string.length; i++) {
str += /[A-Z]/.test(string[i]) ? ` ${string[i]}` : `${string[i]}`;
}
return str;
}