(替换)CamelCase功能无法正常工作

时间:2019-06-25 16:43:26

标签: javascript replace

使用此函数调用:

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"

每个单词的首字母为大写,随后的小写为准。

我在做什么错了?

5 个答案:

答案 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'];
}