3
votes

compter les voyelles dans une chaîne en javascript

Je veux obtenir le nombre de voyelles sur la chaîne en utilisant la méthode reduction () de javascript. Le code ci-dessous est le code et le problème est que la valeur de a, e, i, o, u après la déstructuration de l'acc n'est pas définie.

const str = 'I am just a string. I mean nothing serious and I am being used to count the number of vowels I have.';

const strArr = str.split('');



const mapVowels = strArr.reduce(countVowels, {});

function countVowels(acc, char) {
  console.log(char)
  var { a = 0, e = 0, i = 0, o = 0, u = 0 } = acc;
  if (char === "a") {
    return {...acc, a: a + 1};
  }
  if (char === 'i') {
    return { ...acc, i: i + 1}
  }
  if (char === 'e') {
    return { ...acc, e: e + 1}
  }
  if (char === 'o') {
    return { ...acc, o: o + 1}
  }
  if (char === 'u') {
    return { ...acc, u: u + 1}
  }
}
console.log(mapVowels)

Je veux que mapVowels soit un objet avec les touches a, e, i, o, u et valorisent le nombre de fois qu'elles se répètent dans la chaîne.


2 commentaires

Copie possible de Comptage des voyelles en javascript


@RandyCasburn Pas vraiment. L'OP a déjà du code, et le code a un problème très spécifique qui doit être résolu.


4 Réponses :


5
votes

Lorsqu'un caractère non voyelle est trouvé, vous ne retournez pas acc . Donc acc est indéfini à l'itération suivante, et la déstructuration échoue. Renvoie acc même s'il ne s'agit pas d'une voyelle:

const vowels = 'aieou';

const str = 'I am just a string. I mean nothing serious and I am being used to count the number of vowels I have.';

const strArr = str.split('');

const mapVowels = strArr.reduce(countVowels, {});

function countVowels(acc, char) {
  if(!vowels.includes(char)) return acc;
  
  const { [char]: val = 0 } = acc;
  
  return {...acc, [char]: val + 1};
}

console.log(mapVowels)

De plus, vous pouvez rendre le code plus DRY en créer un tableau ou une chaîne de voyelles et utiliser String.includes () ou Array.inclues () pour identifier les voyelles:

const str = 'I am just a string. I mean nothing serious and I am being used to count the number of vowels I have.';

const strArr = str.split('');

const mapVowels = strArr.reduce(countVowels, {});

function countVowels(acc, char) {
  var { a = 0, e = 0, i = 0, o = 0, u = 0 } = acc;
  
  if (char === "a") {
    return {...acc, a: a + 1};
  }
  if (char === 'i') {
    return { ...acc, i: i + 1}
  }
  if (char === 'e') {
    return { ...acc, e: e + 1}
  }
  if (char === 'o') {
    return { ...acc, o: o + 1}
  }
  if (char === 'u') {
    return { ...acc, u: u + 1}
  }
  
  return acc;
}
console.log(mapVowels)


3 commentaires

Vous pouvez le rendre encore plus optimisé en utilisant une instruction switch sur le char plutôt que includes () , mais je suis d'accord que c'est probablement plus lisible .


Je cherchais plus une optimisation DRY que des performances, mais c'est aussi quelque chose à considérer.


Génial! Merci Ori Drori. Excellente optimisation!



4
votes

Ori vous explique pourquoi votre code ne fonctionne pas. Vous dupliquez également beaucoup de code, voici donc un exemple de reduction qui vous permet de construire les décomptes sur une seule ligne.

const str = 'I am just a string. I mean nothing serious and I am being used to count the number of vowels I have.';
const vowelRe = /[aeiou]/;

const countVowels = str.split('').reduce((acc, c) => {

  // Test if the current letter is a vowel
  const found = vowelRe.test(c);
 
  // If it is: if the vowel exists in the object as a key increase the count,
  // and if it doesn't set it to zero, and then increase the count
  if (found) acc[c] = (acc[c] || 0) + 1;

  // return the accumulator
  return acc;
}, {});

console.log(countVowels);


0 commentaires

0
votes

Vous pouvez faire quelque chose comme ceci:

const str = 'I am just a string. I mean nothing serious and I am being used to count the number of vowels I have.';

const VOWELS = ['a', 'e', 'i', 'o', 'u', 'y'];

var count = str.trim().split('').reduce((accum, el) => {
  if (VOWELS.indexOf(el) > -1) {
    accum[el] += 1;
  }
  return accum;
}, {
  'a': 0,
  'e': 0,
  'i': 0,
  'o': 0,
  'u': 0,
  'y': 0
});

console.log(count);


0 commentaires

0
votes

Cette approche prend les caractères voulus, construit un objet pour le comptage et prend un contrôle et compte le caractère, si dans l'objet.

const
    vowels = 'aieou';
    str = 'I am just a string. I mean nothing serious and I am being used to count the number of vowels I have.';
    mapVowels = Array
        .from(str.toLowerCase())
        .reduce(
            (acc, char) => (char in acc && acc[char]++, acc),
            Object.assign(...Array.from(vowels, c => ({ [c]: 0 })))
        );

console.log(mapVowels);


0 commentaires