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.
4 Réponses :
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)
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!
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);
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);
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);
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.