Мне нужно разработать код, который считывает каждую опцию в массиве, подсчитывая гласные и согласные в каждой опции. Это также нужно напечатать в консоли.
let vowels = 0;
let consonants = 0;
const fruits = ["Apple", "Orange", "Pear", "Peach", "Strawberry", "Cherry", "Acai"];
for (let fruit in fruits) {
console.info(fruits[fruit]);
if (fruits[fruit] == "a" || fruits[fruit] == "e" || fruits[fruit] == "i" || fruits[fruit] == "o" || fruits[fruit] == "u") {
vowels + 1;
}
else {
consonants + 1;
}
}
Это то, что у меня есть до сих пор, может кто-нибудь объяснить мне, что мне не хватает? После того, как я запустил его в коде Visual Studio, консоль по-прежнему отображала все параметры в массиве, не регистрируя, обращались ли или увеличивались ли гласные или согласные переменной переменной:
Редактировать: мне нужно подсчитать каждое слово в массиве и показать, сколько гласных и согласных в каждом слове.
[Running] node "d:\coding.js"
Apple
Orange
Pear
Peach
Strawberry
Cherry
Acai
[Done] exited with code=0 in 0.128 seconds
Почему вы ожидали иного? Вы console.info
безоговорочно и никогда не смотрите на значения переменных, которые вы увеличиваете.
Вы хотите смотреть только на одну букву в слове или вам нужно считать каждую букву в каждом слове?
fruits[fruit] == "a"
проверяет, например. Apple"= = "a"
. Вместо этого вам нужно проверить, является ли каждый символ «яблоко» «а»
@bjelli Мне нужно посчитать каждую букву в слове и записать в консоль, сколько гласных и согласных в этом слове. Затем сделайте то же самое для каждого слова в массиве.
const fruits = ["Apple", "Orange", "Pear", "Peach", "Strawberry", "Cherry", "Acai"];
const vowels = fruits.flatMap(i=>[...i.toLowerCase()])
.filter(c=>'aeiou'.includes(c)).length;
const consonants = fruits.join('').length - vowels;
console.info(vowels, consonants)
или используя регулярное выражение, благодаря комментарию Дэйва ниже:
const fruitsString = ["Apple", "Orange", "Pear", "Peach", "Strawberry",
"Cherry", "Acai"].join('')
const vowels = fruitsString.match(/[aeiou]/ig).length
const consonants = fruitsString.length - vowels
console.info(vowels, consonants)
(Есть... 15... гласных... giphy.com/gifs/69rOXF4YTDVDD6cwkt) Когда FP - ваш молоток, все выглядит как большой палец.
@DaveNewton Примечание: предыдущее редактирование забыли сделать .toLowerCase()
, что, я думаю, вы имели в виду. Я думаю, вы бы предпочли подход регулярных выражений. Я реже использую regex a loss в обычном программировании, поэтому я по умолчанию использую этот подход.
fruits.join('').toLowerCase().match(/[aeiou]/g).length
Очевидно, что время выполнения имеет значение, но поверхностный бенчмаркинг показывает, что версия регулярного выражения заметно быстрее.
@DaveNewton или просто используйте /ig
в регулярном выражении :)
Преобразование их один раз должно быть постепенно быстрее, чем дополнительная работа в механизме регулярных выражений, но опять же, время выполнения будет иметь большое значение.
@DaveNewton Я думаю, может быть, на меня просто слишком повлияла цитата «используйте регулярное выражение для решения проблемы, теперь у вас есть две проблемы ...», и я недостаточно использую ее в простых случаях.
Дело не столько в том, что «регулярные выражения здесь хороши» (кажется неприятным), а в том, что «некоторые FP выполняют дополнительную и/или избыточную работу» и «движкам регулярных выражений уделяется много внимания».
(FWIW я сделал упрощенный тест на jsbench.me, и //ig
работает медленнее, с оговоркой, что я не тестирую в браузерах или в Node, так что :shrug:)
@DaveNewton «движкам регулярных выражений уделяется много внимания», так как над ними ведется большая работа по разработке с целью оптимизации производительности?
Ага; они (как правило) довольно оптимизированы.
Я добавил еще несколько console.infos в ваш код,
и я использовал другую переменную letter
.
Вы хотите смотреть только на одну букву в слове, или нужно считать каждую букву в каждом слове?
let vowels = 0;
let consonants = 0;
const fruits = ["Apple", "Orange", "Pear", "Peach", "Strawberry", "Cherry", "Acai"];
for (let word of fruits) {
console.info("working on word", word);
letter = word[0]; // this is probably wrong, do you need to check EVERY letter of a word?
console.info(" looking at letter", letter);
if (letter == "a" || letter == "e" || letter == "i" || letter == "o" || letter == "u") {
vowels + 1;
}
else {
consonants + 1;
}
console.info(" up to now i found", vowels, "vowels and", consonants, "consonants");
}
Вы написали, что нужно считать каждую букву, поэтому нам нужен еще один цикл, чтобы пройти каждая буква текущего слова:
let vowels = 0;
let consonants = 0;
const fruits = ["Apple", "Orange", "Pear", "Peach", "Strawberry", "Cherry", "Acai"];
for (let word of fruits) {
console.info("working on word", word);
for (let letter of word.split('')) {
console.info(" looking at letter", letter);
if (letter == "a" || letter == "e" || letter == "i" || letter == "o" || letter == "u") {
vowels += 1;
}
else {
consonants += 1;
}
console.info(" up to now i found", vowels, "vowels and", consonants, "consonants");
}
}
Это все еще не считает прописные буквы. Но я уверен вы можете исправить это.
«Работая над словом Apple, глядя на букву Apple, до сих пор я нашел 0 гласных и 0 согласных» кажется неверным в качестве вывода
Да, точно. ОП должен решить, хотят ли они обрабатывать отдельные письма и как....
Мне нужно подсчитать каждую букву в каждом слове и журнал консоли, сколько гласных и согласных в каждом слове, когда оно идет вниз по массиву
«без регистрации, обращались ли к переменным Гласные или Согласные даже или увеличивались ли они» - Где вы когда-либо наблюдали или выводили
vowels
илиconsonants
? Вы просто забыли записать эти значения в консоль? (Кроме того... Если вы используетеfor ... of
вместоfor ... in
в этом случае, вы можете просто ссылаться на значение какfruit
вместо более неуклюжегоfruits[fruit]
.)