我想这涉及到你想避免正则表达式,但它是相当快:
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
你的函数的整个身体可以用'回报str.split(炭)。长度来代替 - 1;' - 奖金,你可以搜索串串的发生:P –
更有说服力 - 是的,总是有抽象的潜力。更快 - 不,你不能四处看看字符串的每个字符。 – Bergi
您可以将'str.charAt(i)'更改为'str [i]',从而使用更少的函数调用保持基本相同的算法。 *“除了使用正则表达式”* - 为什么不是正则表达式? – nnnnnn