2017-08-10 54 views
3

簡單地試圖找出給定字符出現在字符串中的次數,但我無法以任何其他方式解決它,然後這個簡單的for-loop。有沒有一種方法可以解決這個更快或更雄辯的比使用正則表達式?檢查字符串中出現字符的次數

function countCharacter(str, char) { 

    var count = 0; 
    for(var i = 0; i < str.length; i++){ 
    if(str.charAt(i) === char) 
     count++; 
    } 
return count; 
} 
+4

你的函數的整個身體可以用'回報str.split(炭)。長度來代替 - 1;' - 獎金,你可以搜索串串的發生:P –

+1

更有說服力 - 是的,總是有抽象的潛力。更快 - 不,你不能四處看看字符串的每個字符。 – Bergi

+0

您可以將'str.charAt(i)'更改爲'str [i]',從而使用更少的函數調用保持基本相同的算法。 *「除了使用正則表達式」* - 爲什麼不是正則表達式? – nnnnnn

回答

0

我想這涉及到你想避免正則表達式,但它是相當快:

function countCharacter(str, char) { 
    return str.length - str.replace(new RegExp(char,"g"),"").length; 
} 

您也可以嘗試str.split(char).length-1方法,通過Jaromanda建議。

或者,全力以赴配合一些有趣的遞歸(通過0到startingFrom):

function countCharacter(str, char, startingFrom) { 
    var idx = str.indexOf(char, startingFrom); 
    return idx == -1 ? 0 : 1 + countCharacter(str, char, idx + 1); 
} 

你可以在某些效率爲代價擺脫了煩人的額外說法:

function countCharacter(str, char) { 
    var idx = str.indexOf(char); 
    return idx == -1 ? 0 : 1 + countCharacter(str.substr(idx+1), char); 
} 

這裏是一個針對速度進行了優化的版本(根據jsperf,這比我的瀏覽器快了3倍,比正則表達式快了很多):

function countCharacter(str, char) { 
    var start = 0; 
    var count = 0; 
    while((start = str.indexOf(char, start)+1) !== 0) { 
     count++; 
    } 
    return count; 
} 

請注意,indexOf方法通常比通過字符串手動迭代快得多。請參閱jsperf

+0

或簡單的'str.match(新的RegExp(char,'g'))length。 '雖然 –

+0

是真的,這可能更優雅 –

+0

然後有'str.replace(新的RegExp('[^'+ char +']','g'),'').length'。 ;-)請注意,* match *永遠不會返回0,它將返回* null *,而'null.length'將引發錯誤。爲什麼要使用'.map()'而不僅僅是'.filter()'。().-(或許''(str.match(new RegExp(char,'g'))|| []).length'。 – RobG

3

市場上有很多可行的方法。 我正在添加其中的一些。

方法1:

str = "The man is as good as his word" 
str.split('a') 
output: (4) ["The m", "n is ", "s good ", "s his word"] 
str.split('a').length - 1 
output: 3 

方法2:

str = "The man is as good as his word" 
str.split('').map(function(char,i) 
    { if(char === 'a') 
     return i; 
    } 
).filter(Boolean) 
Output: (3) [5, 11, 19] 

str.split('').map(function(char,i) 
    { if(char === 'a') 
     return i; 
    } 
).filter(Boolean).length 

ouput: 3 

編輯:按照意見,我們還可以使用過濾器的()。

str.split('').filter(function(char, i){ 
     if(char == 'a'){ 
      return i; 
     } 
    }) 
    output: (3) ["a", "a", "a"] 

str.split('').filter(function(char, i){ 
    if(char == 'a'){ 
     return i; 
    } 
}).length 
output: 3 
+0

在其自己的? – nnnnnn

0

使用reduce

function countCharacter(str, char) { 
    return str.split('').reduce((a, x) => x === char ? ++a : a, 0); 
} 
0

在這裏你去。一行代碼

"hello".match(new RegExp('l','g')).length 

與任何字符替換'l'這裏,new RegExp('l','g')

str.match(new RegExp(char,'g')).length 
相關問題