JavaScript - функция, которая разбивает строку на слова, идентифицирует слово с наибольшим количеством гласных - использование для цикла - PullRequest
2 голосов
/ 23 марта 2019

Я проверил несколько похожих вопросов , но я не чувствую, что ответы относятся непосредственно к тому, что я ищу.

Я пытаюсь найти слово с наибольшим количеством гласных в данной строке. Я знаю, как разбить строку на такие слова:

let words = string.split(" ");

А пока у меня есть:

function mostVowels(string) {

  let vowels = ["aeiouAEIOU"];
  let words = string.split(" ");

  //initiate vowel count at 0

  let counter = 0;

  //loop through words

  for (let i = 0; i < words.length; i++) {
    //if there are vowels in the word, add vowels to counter
    if (vowels.includes(i)) {
      counter++
    }
  }
  return counter;
}

console.log(mostVowels("I went to the park today."));

Так что, очевидно, я довольно далек от достижения решения.

Прямо сейчас это возвращается 0.

В каждом из первых пяти слов в этой строке есть 1 гласная, и в "сегодня" есть две гласные, поэтому в конечном итоге мы хотим, чтобы эта функция возвращала "сегодня" как слово с наибольшим количеством гласных.

На данный момент я просто пытаюсь получить количество гласных для первого слова в строке - это должно быть 1.

Тогда я полагаю, что смогу сравнить количество разных слов, чтобы определить, какое из них самое большое.

Ответы [ 4 ]

2 голосов
/ 23 марта 2019

Определите ваш vowels как массив символов , а не как массив, содержащий одну строку. Затем внутри цикла над words инициализируйте счетчик равным 0 и выполняйте итерацию по каждому символу в слове. Если символ включен в массив гласных, увеличьте счетчик. В конце итерации по слову, если счетчик для этого слова лучше, чем лучший счетчик на данный момент, присвойте счетчик и слово внешним переменным, указывая лучшее слово / счетчик на данный момент. В конце функции верните лучшее слово:

function mostVowels(string) {

  let vowels = [..."aeiouAEIOU"];
  let words = string.split(" ");

  let bestCounter = 0;
  let bestWord;
  for (let i = 0; i < words.length; i++) {
    const word = words[i];
    //initiate vowel count at 0
    let counter = 0;
    for (let i = 0; i < word.length; i++) {
      const char = word[i];
      //if there are vowels in the word, add vowels to counter
      if (vowels.includes(char)) {
        counter++
      }
    }
    // finished iterating through loop,
    // now check to see if it's better than the best word so far:
    if (counter > bestCounter) {
      bestCounter = counter;
      bestWord = word;
    }
  }
  return bestWord;
}

console.log(mostVowels("I went to the park today."));
console.log(mostVowels("I went to the fooaeuiubar park today."));

Или, возможно, более элегантно, используя вместо этого методы массива:

const vowels = [..."aeiouAEIOU"];
const getVowelCount = word => [...word].reduce((a, char) => a + Boolean(vowels.includes(char)), 0);
function mostVowels(string) {
  let bestCounter = 0;
  return string.split(' ')
    .reduce((bestWordSoFar, thisWord) => {
      const thisVowelCount = getVowelCount(thisWord);
      if (thisVowelCount > bestCounter) {
        bestCounter = thisVowelCount;
        return thisWord;
      } else {
        return bestWordSoFar;
      }
    });
}

console.log(mostVowels("I went to the park today."));
console.log(mostVowels("I went to the fooaeuiubar park today."));
1 голос
/ 23 марта 2019

Немного короче альтернатива с сортировкой:

const vowels = s => s.split(/[aeiou]/i).length - 1; 

const mostVowels = s => s.split(/\W/).sort((a, b) => vowels(b) - vowels(a))[0];

console.log( mostVowels("I went to the park today.") );

и без сортировки:

const vowels = s => s.replace(/[^aeiou]/gi, '').length;

const mostVowels = s => s.split(/\W/).reduce((a, b) => vowels(a) > vowels(b) ? a : b);

console.log( mostVowels("I went to the park today.") );
1 голос
/ 23 марта 2019

Один альтернативный вариант - использовать regex

let mostVowels = (input) =>{
  let max = 0;
  let splited = input.split(' ')
  splited.forEach((e, index) => {
    let count = (e.match(/[aeiou]/gi)||[]).length
    max = count > max ? index : max
  })
  return splited[max]
}

console.log(mostVowels("I went to the park today."));
console.log(mostVowels("I went to the fooaeuiubar park today. xyz"));
1 голос
/ 23 марта 2019

Я пытался подойти к этому с помощью карты-редукции, стараясь, чтобы все было чисто и чисто.Но я должен был установить mostVowels в уменьшении, делая это немного глупо.

Но вот мой выстрел:

const handleSentence = (sentence = '') => {
  const vowels = /[a|e|i|o|u]+/gi;
  const words = sentence.split(' ');
  let mostVowels = '';
  
  const getVowels = (str = '') => {
    try {
      return str.match(vowels).join('').length
    } catch (err) {
      return 0;
    }
  };

  const getMostVowels = (a, b, i) => {
    if (a < b) {
      mostVowels = words[i];
      return b;
    }
  
    return a;
  }
  
  words.map(getVowels).reduce(getMostVowels);
  return mostVowels;
}

console.log(handleSentence('this is an example string for demonstrating the function'));

console.log(handleSentence('yet another example of the effectiveness of function'));

console.log(handleSentence('gypsy rhythm'));
...