web-dev-qa-db-fra.com

Compter le nombre de voyelles dans une chaîne avec JavaScript

J'utilise JavaScript de base pour compter le nombre de voyelles dans une chaîne. Le code ci-dessous fonctionne, mais j'aimerais le nettoyer un peu. Est-ce que l'utilisation de .includes() aiderait du tout à considérer qu'il s'agit d'une chaîne? J'aimerais utiliser quelque chose comme string.includes("a", "e", "i", "o", "u") dans la mesure du possible pour nettoyer l'instruction conditionnelle. Aussi, est-il nécessaire de convertir l'entrée en chaîne?

function getVowels(str) {
  var vowelsCount = 0;

  //turn the input into a string
  var string = str.toString();

  //loop through the string
  for (var i = 0; i <= string.length - 1; i++) {

  //if a vowel, add to vowel count
    if (string.charAt(i) == "a" || string.charAt(i) == "e" || string.charAt(i) == "i" || string.charAt(i) == "o" || string.charAt(i) == "u") {
      vowelsCount += 1;
    }
  }
  return vowelsCount;
}
6
dcook

Vous pouvez réellement le faire avec une petite regex:

function getVowels(str) {
  var m = str.match(/[aeiou]/gi);
  return m === null ? 0 : m.length;
}

Cela correspond simplement à l'expression régulière (g le fait rechercher dans toute la chaîne, i le rend insensible à la casse) et renvoie le nombre de correspondances. Nous vérifions null s'il n'y a pas de correspondance (c'est-à-dire pas de voyelles) et retournons 0 dans ce cas.

21
James Thorpe

Convertissez la chaîne en tableau à l'aide de la méthode Array.from() , puis utilisez la méthode Array.prototype.filter() pour filtrer le tableau afin qu'il ne contienne que des voyelles, puis la propriété length contiendra le nombre de voyelles.

const countVowels = str => Array.from(str)
  .filter(letter => 'aeiou'.includes(letter)).length;

console.log(countVowels('abcdefghijklmnopqrstuvwxyz')); // 5
console.log(countVowels('test')); // 1
console.log(countVowels('ddd')); // 0

4
function countVowels(subject) {
    return subject.match(/[aeiou]/gi).length;
}

Vous n'avez pas besoin de convertir quoi que ce soit, le traitement des erreurs par Javascript est suffisant pour vous indiquer une fonction aussi simple si cela s'avère nécessaire.

3
sudo

Short et ES6, vous pouvez utiliser la fonction count (str);

const count = str => (str.match(/[aeiou]/gi) || []).length;
1
Sumer

Vous pouvez convertir la chaîne donnée en un tableau à l'aide de l'opérateur spread , puis vous pouvez filter() les caractères uniquement pour ceux qui sont des voyelles.

Ensuite, vous pouvez vérifier la length du tableau pour obtenir le nombre total de voyelles de la chaîne:

const vowel_count = string => [...string].filter(c => 'aeiou'.includes(c.toLowerCase())).length;

console.log(vowel_count('aaaa'));            // 4
console.log(vowel_count('AAAA'));            // 4
console.log(vowel_count('foo BAR baz QUX')); // 5
console.log(vowel_count('Hello, world!'));   // 3

1
Grant Miller

Utilisez match mais faites attention car il peut renvoyer un null si aucune correspondance n'est trouvée

const countVowels = (subject => (subject.match(/[aeiou]/gi) || []).length);
1
Radu Chiriac

count = function(a) {
  //var a=document.getElementById("t");
  console.log(a); //to see input string on console
  n = a.length;
  console.log(n); //calculated length of string
  var c = 0;
  for (i = 0; i < n; i++) {
    if ((a[i] == "a") || (a[i] == "e") || (a[i] == "i") || (a[i] == "o") || (a[i] == "u")) {
      console.log(a[i]); //just to verify
      c += 1;
    }
  }

  document.getElementById("p").innerText = c;
}
<p>count of vowels </p>
<p id="p"></p>
<input id="t" />
<input type="button" value="count" onclick="count(t.value)" />

0
Prateek G

C'est la solution la plus courte

 function getCount(str) {
 return (str.match(/[aeiou]/ig)||[]).length;
 }
0
Akash More
Function vowels(str){
   let count=0;
   const checker=['a','e','i','o','u'];
   for (let char of str.toLowerCase){
      if (checker.includes(char)){
        count++;
      }
   return count;
}


Function vowels(str){
   const match = str.match(/[aeiou]/gi);
   return match ? match.length : 0 ;
}
0
user9248223

Cela pourrait également être résolu en utilisant .replace () method en remplaçant tout ce qui n'est pas une voyelle par une chaîne vide (en gros, il supprimera ces caractères) et en renvoyant la nouvelle longueur de chaîne:

function vowelCount(str) {
  return str.replace(/[^aeiou]/gi, "").length;
};

ou si vous préférez ES6

const vowelCount = (str) => ( str.replace(/[^aeiou]/gi,"").length )
0
Iulius

Utilisez simplement cette fonction [pour ES5]: 

function countVowels(str){
    return (str.match(/[aeiou]/gi) == null) ? 0 : str.match(/[aeiou]/gi).length;        
}

Travaillera comme un charme

0
maximast