大写每个单词的第一个字母

时间:2015-08-18 00:00:31

标签: javascript string

var name = "AlbERt EINstEiN";

function nameChanger(oldName) {
var finalName = oldName;
// Your code goes here!
finalName = oldName.toLowerCase();

finalName = finalName.replace(finalName.charAt(0), finalName.charAt(0).toUpperCase());

for(i = 0; i < finalName.length; i++) {
    if (finalName.charAt(i) === " ")
        finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());
}


// Don't delete this line!
return finalName;
};

// Did your code work? The line below will tell you!
console.log(nameChanger(name));

我的代码原样,返回'Albert einstein'。我想知道我哪里出错了? 如果我加入

console.log(finalName.charAt(i+1));

在if语句之后,并注释掉其余部分,它会打印'e',因此它会识别charAt(i+1),就像它应该......我只是无法将它用于大写第二个单词的第一个字母。< / p>

5 个答案:

答案 0 :(得分:4)

您的代码示例存在两个问题。我会一个接一个地浏览它们。

字符串是不可变的

这并不像你认为的那样工作:

finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());

您需要将其更改为:

finalName = finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());

在JavaScript中,字符串不可变。这意味着一旦创建了一个字符串,就无法更改它。这可能听起来很奇怪,因为在您的代码中,您似乎正在使用finalName等方法在整个循环中更改字符串replace()

但实际上,你并没有真正改变它! replace()函数接受输入字符串,进行替换,产生新的输出字符串,因为它实际上不允许更改输入字符串(不变性)。所以,如果你没有通过将replace()的输出分配给变量来捕获finalName = finalName.replace(...)的输出,那么替换后的字符串就会丢失。

顺便说一下,将它分配回原始变量名称是可以的,这就是为什么你可以replace()

替换是贪婪的

您遇到的另一个问题是,当您使用replace()时,您将替换字符串中匹配字符的所有,而不仅仅是在你正在检查的位置。这是因为slice()是贪婪的 - 如果你告诉它取代&#39; e&#39;用&#39; E&#39;,它将取代所有这些!

基本上,您需要做的是:

  1. 找一个空格字符(你已经完成了这个)
  2. 抓住所有绳子,包括空间;这个&#34; side&#34;字符串很好。
  3. 将下一个字母转换为大写,但只转换为该字母。
  4. 抓住剩余的字符串,过去你转换的字母。
  5. 将所有三个部分放在一起(字母串,大写字母,字符串结尾)。
  6. if (finalName.charAt(i) === " ") { // Get ONLY the letter after the space var startLetter = finalName.slice(i+1, i+2); // Concatenate the string up to the letter + the letter uppercased + the rest of the string finalName = finalName.slice(0, i+1) + startLetter.toUpperCase() + finalName.slice(i+2); } 方法可以执行您想要的操作:

    $newArray = array_filter($orders, function($v)use($del_itemid, $del_modiifier){
        if($v["itemid"] == $del_itemid && $v["modifier"] == $del_modiifier)
            return FALSE;
        return TRUE;
    });
    

    另一种选择是正则表达式(正则表达式),其他答案提到了。这可能是一个更好的选择,因为它更清洁。但是,如果您是第一次学习编程,通过编写原始循环可以更容易地理解这个手工字符串的工作。以后你可以搞乱这种有效的方法。

    工作jsfiddle:http://jsfiddle.net/9dLw1Lfx/

    进一步阅读:

答案 1 :(得分:4)

如果将 RegExp /pattern/flags函数传递到str.replace而不是使用子字符串

function nameChanger(oldName) {
    var lowerCase = oldName.toLowerCase(),
        titleCase = lowerCase.replace(/\b./g, function ($0) {return $0.toUpperCase()});
    return titleCase;
};

在此示例中,我已在word boundary \b之后将更改应用于任何字符.,但您可能需要更具体的/(^| )./g

答案 2 :(得分:1)

这个问题的另一个好答案是使用RegEx为你做这件事。

var re = /(\b[a-z](?!\s))/g;
var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon"; 
s = s.replace(re, function(x){return x.toUpperCase();});
console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon"

正在使用的正则表达式可能需要略微更改,但这可以让您了解使用正则表达式可以做什么

Capitalize Letters with JavaScript

答案 3 :(得分:1)

问题是双重的:

1)您需要为finalName.replace返回一个值,因为该方法返回一个元素,但不会改变它所谓的元素。

2)你没有迭代字符串值,所以你只是改变了第一个单词。你不想改变每个单词,所以它是小写的大写字母吗?

此代码可以更好地为您服务:

   var name = "AlbERt EINstEiN";

function nameChanger(oldName) {

    // Your code goes here!

    var finalName = [];
    oldName.toLowerCase().split(" ").forEach(function(word) {
        newWord = word.replace(word.charAt(0), word.charAt(0).toUpperCase());
        finalName.push(newWord);
    });


    // Don't delete this line!
    return finalName.join(" ");
};

    // Did your code work? The line below will tell you!
    console.log(nameChanger(name));

答案 4 :(得分:-4)

if (finalName.charAt(i) === " ")

不应该

if (finalName.charAt(i) == " ")

不检查===检查对象类型是否相等,不应该是一个char,另一个是字符串。