2017-02-21 79 views
0

我正在嘗試大寫字符串中每個單詞的第一個字母。我想分3步進行:無法大寫單詞的第一個字母

  1. 使用.split()將字符串轉換爲數組。
  2. 創建一個循環,並通過使用數組索引對其進行尋址來更改每個單詞中的第一個字母。
  3. 最後我想用.join把所有東西都放回到一個字符串中。

但是出了點問題,我不能去第三步。 for循環確實將字母改爲大寫,但是當我返回變量上限時,它只返回字符串中最後一個單詞的第一個大寫字母。在這個例子中,它是P(最後一個詞是罐子),如果我刪除罐子,它返回T(因爲茶是最後一個詞)。

爲什麼cap變量不能返回大寫首字母的整個數組?我錯過了什麼?

下面的代碼:

function titleCase(str) { 
    var arr = str.split(" "); 
    for (i = 0; i < arr.length; i++) { 
    var cap = arr[i][0].toUpperCase(); 
    } 
    return cap; 
} 

titleCase("I'm a little tea pot"); 
+2

的[字符串轉換爲用JavaScript標題情況]可能的複製(http://stackoverflow.com/questions/196972/convert-string- to-title-case-with-javascript) –

+1

您正在設置'var cap =「當前單詞的第一個字母'',因此一旦循環完成,'cap'將被設置爲最後一個字母字。 – Santi

+0

對於您可以在CSS中輕鬆完成的操作,這是很多開銷: .myclass { text-transform:capitalize; } – Korgrue

回答

3

那是因爲你剛剛返回帽變量,它包含了遺言首字母大寫(由最後一次迭代左)。

function titleCase(str) { 
    var arr = str.split(" "); 

    for (i = 0; i < arr.length; i++) { 
     var word = arr[i]; 
     // capitalized first letter + rest of the word 
     var capitalizedWord = word[0].toUpperCase() + word.slice(1); 

     arr[i] = capitalizedWord; // replace the uncapitalized word with capitalized one 
    } 

    return arr.join(" "); // join with spaces to make it a sentence again 
} 

titleCase("I'm a little tea pot"); 
0

我想這就是答案:

const capitalizeFirst = data => data.replace(/[\w']+/g, x => x[0].toUpperCase() + x.slice(1).toLowerCase()) 
 

 
console.log(capitalizeFirst("I'm a little tea pot"))

+1

不知道你是否真的試圖用一個聰明的解決方案或試圖混淆一個聰明的解決方案提出一個微不足道的問題的傢伙:) –

+0

我想顯示解決這個問題的其他方式,而不使用額外的變量 –

1

這是因爲cap只有這樣,你遍歷你的話也不斷得到通過的第一個字母覆蓋變量下一個詞。讓它成爲一個數組或將下一個字母連接到它上面。

0

您在每次迭代中覆蓋變量cap。 您的代碼稍作修改:

function titleCase(str) { 
    var arr = str.split(" "); 
    var cap = ""; 
    for (i = 0; i < arr.length; i++) { 
    if (i != arr.length - 1) { 
     cap += arr[i][0].toUpperCase() + arr[i].substr(1) + " "; 
    } else { 
     cap += arr[i][0].toUpperCase() + arr[i].substr(1); 
    } 
    } 
    return cap; 
} 

titleCase("I'm a little tea pot"); 
0

您正在犯的一個Javascript的基本罪!不要在循環中聲明變量。

function titleCase(str) { 
    var cap; 
    var arr = str.split(" "); 
    for (i = 0; i < arr.length; i++) { 
    cap = arr[i][0].toUpperCase(); 
    } 
    return cap; 
} 

將是輸入你寫的東西的正確方法。

當您的for循環在您的示例中進行迭代時,它會在每次重新聲明變量時導致一些不好的事情發生。在我的例子中,它每次都重新定義,但只聲明一次。

但是,這對您的問題仍然不正確。當你想要整個字符串時,這隻會給你單個字母。嘗試這樣的事情

function titleCase(str) { 
    var arr = str.split(" "); 
    var wordToCap; 
    var capWord; 
    var capArray = []; 
    for (var i = 0; i < arr.length; i++) { 
    wordToCap = arr[i]; 
    capWord = wordToCap.charAt(0).toUpperCase() + wordToCap.substring(1); 
    capArray.push(capWord); 
    } 
    return capArray.join(" "); 
} 

有更優雅的解決這一問題的辦法,但希望這裏所有細分的步驟將幫助您瞭解您的循環正在做和應該做的。

祝你好運!

0

ES2015溶液:

const titleCase = str => 
    str.split(' ').map(word => 
    word.charAt(0).toUpperCase() + word.slice(1) 
).join(' '); 

titleCase("I'm a little tea pot")); 

工作實施例:https://jsfiddle.net/ecdkxrjd/

相關問題