我需要使用循环找出数组的每个字符串中有多少个元音字母。看不出我做错了什么
I need to find how many vowels are in each string of the array using loops. Can't see what I'm doing wrong
因此,对于课程任务,我需要遍历一系列水果,找出一个单词中有多少元音和辅音。
对于它说我需要使用 for-in、for 循环和 case-switch 或 nested-if 语句的任务。这是我的代码:
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`);
我是 JS 的新手,我似乎看不出我做错了什么。
需要注意的一件事是 for-in
用于对象,而 for-each
用于数组。尽管您似乎需要为这个特定的位使用特定的功能,但我想我会指出这一点以供将来使用。
您实际上对代码所做的是将数组中的每个元素设置为一个对象。例如每个变量变为:
0:"Apple", 1:"Orange", ...
所以如果我们遍历,每个 fruit
的长度都是 1。
你问题的答案是看看你是如何创建你的 for 循环的,与你如何创建你的 switch case 相比。您真正想要的不是 fruit
的长度,而是 fruits[fruit]
的长度(如果这有意义的话)。例如:
for (var i = 0; i < fruits[fruit].length; i++) {
switch (fruits[fruit][i]){
...
}
}
--
我看到的另一个问题是您跟踪常量的方式。您可能不应该将常量更新为 constants = VOWELS +1
.
--
我注意到的最后一件事是你最后的 console.log
实际上不会输出关于苹果的信息,它实际上会输出关于 fruits
数组中最后一个水果的信息(即 Acai
)
一个可能的解决方案是使用正则表达式。
- 首先匹配元音
- 使用输出可以动态生成正则表达式。
- 然后您可以从字符串中删除元音以获得辅音。
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 });
因此,对于课程任务,我需要遍历一系列水果,找出一个单词中有多少元音和辅音。 对于它说我需要使用 for-in、for 循环和 case-switch 或 nested-if 语句的任务。这是我的代码:
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`);
我是 JS 的新手,我似乎看不出我做错了什么。
需要注意的一件事是 for-in
用于对象,而 for-each
用于数组。尽管您似乎需要为这个特定的位使用特定的功能,但我想我会指出这一点以供将来使用。
您实际上对代码所做的是将数组中的每个元素设置为一个对象。例如每个变量变为:
0:"Apple", 1:"Orange", ...
所以如果我们遍历,每个 fruit
的长度都是 1。
你问题的答案是看看你是如何创建你的 for 循环的,与你如何创建你的 switch case 相比。您真正想要的不是 fruit
的长度,而是 fruits[fruit]
的长度(如果这有意义的话)。例如:
for (var i = 0; i < fruits[fruit].length; i++) {
switch (fruits[fruit][i]){
...
}
}
--
我看到的另一个问题是您跟踪常量的方式。您可能不应该将常量更新为 constants = VOWELS +1
.
--
我注意到的最后一件事是你最后的 console.log
实际上不会输出关于苹果的信息,它实际上会输出关于 fruits
数组中最后一个水果的信息(即 Acai
)
一个可能的解决方案是使用正则表达式。
- 首先匹配元音
- 使用输出可以动态生成正则表达式。
- 然后您可以从字符串中删除元音以获得辅音。
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 });