So for a course task I need to iterate through an array of fruits to find out how many vowels and consonants are in a word. For the task it says I need to use for-in, for loops and either case-switch or nested-if statements. Here is the code I have:
const fruits = ["Apple", "Orange", "Banana", "Pear", "Peach", "Strawberry", "Cherry", "Acai"];
for (let fruit in fruits) {
var vowels = 0;
var consonants = 0;
for (var i = 0; i < fruit.length; i ) {
switch (fruits[fruit][i]) {
case "A":
case "E":
case "I":
case "O":
case "U":
case "a":
case "e":
case "i":
case "o":
case "u":
vowels = vowels 1;
break;
default:
consonants = vowels 1;
break;
}
}
}
console.log(`Apple has ${vowels} vowels and ${consonants} consonants`);
I'm pretty new to JS and I just can't seem to see what I'm doing wrong.
CodePudding user response:
One thing to note is that for-in
is for objects, where as for-each
is used for arrays. Although it seems that you need to use specific functions for this particular bit, thought I would point this out for future use.
What you are essentially doing with your code is setting each element in the array to an object. For instance each variable becomes:
0:"Apple", 1:"Orange", ...
So if we are iterating through, each fruit
would have a length of 1.
The answer to you issue is to look at how you have created your for loop compared to how you are creating your switch case. What you really want is not the length of fruit
, but the length of fruits[fruit]
if that makes any sense. For example:
for (var i = 0; i < fruits[fruit].length; i ) {
switch (fruits[fruit][i]){
...
}
}
--
Another issue I can see is the way you are tracking your constants. You probably shouldn't have your constants being updated as constants = VOWELS 1
.
--
The last thing I have noticed is that your console.log
at the end will not actually be outputting information regarding apples, it will actually be outputting the iniformation about the last fruit in the fruits
array (i.e. Acai
)
CodePudding user response:
A possible solution could be with regex.
- first you match the vowels
- with the output you can dynamically generate a regex.
- then you can remove the vowels from the string in order to get the consonats.
const regex = /([aeiou])/gi;
const fruits = ["Apple", "Orange", "Banana", "Pear", "Peach", "Strawberry", "Cherry", "Acai"];
const map = fruits.reduce((map, fruit) => {
const vowels = fruit.match(regex);
const consonats = fruit.replaceAll(new RegExp(`(${vowels.join("|")})`, "ig"), "");
map[fruit] = { vowels, consonats: consonats.split("") }
return map;
}, {})
console.log({ map });