Javascript - Compter le nombre d'occurrences d'un caractère dans une chaîne de caractères

J’ai besoin de compter le nombre d’occurrences d’un caractère dans une chaîne de caractères.

Par exemple, supposons que ma chaîne de caractères contienne :

var str = "ch1,ch2,ch3";

Je veux trouver le nombre de virgules, qui est 2, et le nombre de chaînes après la virgule, qui est 3.

Utilisez une expression régulière si vous savez ce que vous recherchez à l’avance, sinon vous pouvez utiliser le constructeur RegExp, et passer le drapeau g comme argument.

console.log(("ch1,ch2,ch3".match(/,/g) || []).length); // 2

console.log(("ch1,ch2,ch3".match(new RegExp("ch", "g")) || []).length); // 3

match renvoie un résultat nul, d’où l’utilisation de || [].

Il existe au moins trois façons de procéder. La meilleure solution, qui est aussi la plus rapide (grâce au moteur RegEx natif), est placée en tête de la liste.

Méthode 1:

("ch1,ch2,ch3".match(/,/g)||[]).length;    // 2
("ch1,ch2,ch3".match(/ch/g)||[]).length;   // 3

Méthode 2:

"ch1,ch2,ch3".split(",").length - 1;     // 2
"ch1,ch2,ch3".split("ch").length - 1;    // 3

Méthode 3:

var char = "," , str = "ch1,ch2,ch3";
for(var i=-1, index=-2; index != -1; i++, index=str.indexOf(char, index+1)); // 2

Voici une solution très proche, mais elle utilise Array.prototype.reduce

function countChar(char, str) {
  return str.split('').reduce((acc, ch) => ch === char ? acc + 1: acc, 0)
}

String.prototype.split fonctionne beaucoup plus rapidement que String.prototype.replace

Voici une autre solution avec regexp compter le nombre d’occurrences d’un caractère dans une chaîne de caractères - probablement pas rapide, mais court et plus lisible que les autres

"ch1,ch2,ch3".replace(/[^,]/g,'').length     // 2