2016-11-27 103 views
4

我正在解決CoderByte上的一些問題。這個函數的目標是獲取一個字符串並將每個單詞的首字母大寫。例如,'hello world''Hello World'。我不明白爲什麼這段代碼給我'hello world'而不是'Hello World'。我知道這行array[i][0] = array[i][0].toUpperCase();是問題,但不明白爲什麼它不工作。我想出了一個替代解決方案,但我想知道爲什麼這不起作用。非常感謝你的幫助!更改數組中的字符串 - Javascript

function LetterCapitalize(str) { 
    var array = str.split(' '); 
    for (var i = 0; i < array.length; i++) { 
     array[i][0] = array[i][0].toUpperCase(); 
    } 
return array.join(''); 
} 

LetterCapitalize('hello world'); 
+1

看到 http://stackoverflow.com/questions/4878756/javascript-如何對大寫字母進行首字母縮寫 - 每個字都像一個2字的城市 – Sane

+0

var upperCased = str.split(「」).map(function(item){return item.charAt(0 ).toUpperCase()+ item.substr(1)})。join(「」) – JazzCat

+1

[如何在JavaScript中使字符串大寫的第一個字母?](http://stackoverflow.com/questions/1026069 /怎麼辦 - 我 - 讓最首字母的-A-串上case-in-javascript) – Sreekanth

回答

0

您沒有創建二維數組。不能使用[0]引用 - 必須使用子字符串。

注意substr(其中第二個參數是一個長度 - 我們只需要一個字符)和substring(其中第二個參數是結束位置 - 在此省略以至字符串結束)之間的差異。

function LetterCapitalize(str) { 
    var array = str.split(' '); 
    for (var i = 0; i < array.length; i++) { 
     var firstChar = array[i].substr(0,1).toUpperCase(); 
     if array[i].length == 1 
      array[i]=firstChar; 
     else 
      array[i]=firstChar + array[i].substring(1); 
    } 
    return array.join(' '); 
} 

LetterCapitalize('hello world'); 
+0

正確。但是,最好還要提供一個例子,因爲「必須使用子串」是OP可能無法理解的一個廣泛的聲明。 –

-1

試試這個:

function LetterCapitalize(str) { 
     var array = str.split(' '); 
     for (var i = 0; i < array.length; i++) { 

      array[i] = array[i][0].toUpperCase()+array[i].slice(1); 

     } 
    return array.join(' '); 
    } 

LetterCapitalize('hello world'); 
1

你可以使用正則表達式這種情況:

function LetterCapitalize(str) { 
 
    var regex = /(\b[a-z](?!\s))/g; 
 
    str = str.replace(regex, function(x) { 
 
     return x.toUpperCase(); 
 
    }); 
 

 
    console.log(str); 
 
} 
 

 
LetterCapitalize('hello world');

2

的問題是,array[i]指一個字符串。但是,strings are immutable in JavaScript,所以此操作失敗:array[i][0] = array[i][0].toUpperCase()。您無法在字符串上設置單個索引。

要完成你想要的任務,你將不得不創建一個新的字符串,首字母大寫。下面是做這件事,從另一個SO post借款:

function capitalizeFirstLetter(str) { 
    return str.charAt(0).toUpperCase() + str.slice(1); 
} 

function capitalizeAllWords(str) { 
    var words = str.split(' '); 
    return words.map(capitalizeFirstLetter).join(' '); 
} 

capitalizeAllWords('hello world'); 
+0

好吧,我沒有意識到這一點。非常感謝您的幫助 – davysamp

0

一走在功能的方法:

var capitalize = function(str) { 
    return str.split(/\s+/) 
    .map(function(word) { 
     return word.charAt(0).toUpperCase() + word.slice(1); 
    }) 
    .join(' '); 
}; 

作爲獎勵,這個功能也佔\n(新行)和\t(TAB)字符作爲大寫字母的邊界。

1

處理,這將是使用.MAP的一種有效方法()函數

function cap(string){ 
    return string.split(" ").map(function(word){ 
     return word.charAt(0).toUpperCase() + word.slice(1) 
    } 
} 

而到了碼的逐步指南:

.split(」「),使陣列每次增加一個新項目時,都會有一個空格

.map()取值,將其插入函數中,並根據函數返回的結果修改結果。

.charAt(0)得到的第一個字母和 .toUpperCase()大寫它

.slice(1)獲取的第一個字母之後的每一個字母。

乾杯, TheGenieOfTruth

(完成上移動,因此,格式化是參差不齊和代碼是未測試的)有點重複問題的