我想這涉及到你想避免正則表達式,但它是相當快:
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