使用此函数调用:
var StringData = window.ToCamelCase({ 'string': 'HELLO WORLD', 'remSpace': false });
console.log(StringData);
这是我的脚本功能:
function ToCamelCase(data) {
data['string'] = data['string'].replace(/(?:^\w|[A-Z]|\b\w)/g, function(word, index) {
return index == 0 ? word.toUpperCase() : word.toLowerCase();
});
if (data['remSpace']) {
data['string'] = data['string'].replace(/\s/g, '');
}
return data['string'];
}
我没有得到错误;但是不能正常工作,如果我通过了这样的字符串:
"HELLO WORLD"
此刻第二个单词不将首字母大写
输出为:"Hello world"
,我期望为:"Hello World"
每个单词的首字母为大写,随后的小写为准。
我在做什么错了?
答案 0 :(得分:4)
您实际上不需要为此使用正则表达式。您可以使用string.split()
分割字符串,然后将分割数组中的每个元素大写。最后,如果需要,用空格分隔元素重新组合数组:
function ToCamelCase(data) {
const words = data['string'].toLowerCase().split(' ');
const uppercasedWords = words.map(word => {
let splitWord = word.split('');
splitWord[0] = splitWord[0].toUpperCase();
return splitWord.join('');
});
return uppercasedWords.join(data['remSpace'] ? '' : ' ')
}
或更实用的功能
function uppercaseFirstElement(textArray) {
return [textArray[0].toUpperCase(), ...textArray.slice(1)];
}
function capitalizeWord(word) {
return uppercaseFirstElement(word.split('')).join('');
}
function toCamelCase(sentence, removeSpace) { // Really it should be `toPascalCase`
return sentence.toLowerCase().split(' ')
.map(capitalizeWord).join(removeSpace ? '' : ' ');
}
答案 1 :(得分:2)
正如Ian所提到的,您不需要正则表达式来完成这项工作,并且不使用它们可能更有效。
话虽如此,如果您出于某种原因要使其与RegExp一起使用,则可以使用:
function toPascalCase(str) {
return str.replace(/(?:^|\s*)(\S+)(?:\s*|$)/g, (match, word) => word[0].toUpperCase() + word.slice(1).toLowerCase());
}
此代码使用es6箭头功能,因此如果要与旧的浏览器兼容,则需要对其进行更改。这也基于我可以从您的问题中得到的规范,但是关于字母/数字/空格范围之外的特殊字符,有很多情况未处理(它们将被视为单词的一部分,这可能就是您想要的)虽然)。
最后一点:您想要实现的目标实际上叫做PascalCase。在camelCase中,第一个字母是小写。
答案 2 :(得分:1)
首先Ian's solution应该是正确的,因为它是所有这些中最简单且可以理解的解决方案。
如果您要问代码有什么问题,那么我的回答是:
index == 0 ? word.toUpperCase() : word.toLowerCase()
是此语句导致所有问题的原因。到达0
的{{1}}时,您的索引不是"W"
,因此它将变为小写。
相反,您应该做的是捕获单词并将每个单词的第一个字母替换为大写。 "World"
方法是一个很好的解决方案,这就是Ian所做的。我已经使用regex和replace做了类似的事情,尽管不必这样做。
Split
答案 3 :(得分:1)
在您的代码索引中,由于未迭代所有字符串字符,因此将始终返回0 在这里,我尝试使用我的代码,只是将其替换为您的代码,然后让我知道结果。
var StringData = window.toCamelCase({ 'string': 'HELLO WORLD', 'remSpace': false });
console.log(StringData);
function toCamelCase(data) {
var str = data['string'];
var isRemoveSpc = data['remSpace'];
var len = data['string'].length;
var newStr = "";
for(var i = 0; i < len; i++){
if( i == 0) {
newStr += str.charAt(i).toUpperCase();
} else if(str.charAt(i) == " ") {
if(isRemoveSpc) {
i++;
newStr += str.charAt(i).toUpperCase();
} else {
newStr += str.charAt(i);
i++;
newStr += str.charAt(i).toUpperCase();
}
} else {
newStr += str.charAt(i).toLowerCase();
}
}
return newStr;
}
答案 4 :(得分:0)
因为我需要使其与旧浏览器兼容才能使用以下功能(原始版本ES3):
function ToCamelCase(data) {
data['string'] = data['string'].toLowerCase().split(' ');
for (var i = 0; i < data['string'].length; i++) {
data['string'][i] = data['string'][i].charAt(0).toUpperCase() + data['string'][i].slice(1);
}
data['string'] = data['string'].join(' ');
if (data['remSpace']) {
data['string'] = data['string'].replace(/\s/g, '');
}
return data['string'];
}