我需要使用循环找出数组的每个字符串中有多少个元音字母。看不出我做错了什么

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

一个可能的解决方案是使用正则表达式。

  1. 首先匹配元音
  2. 使用输出可以动态生成正则表达式。
  3. 然后您可以从字符串中删除元音以获得辅音。
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 });