2017-08-10 46 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 
相关问题