JavaScript: написать функцию, которая выполняет Pig Latin на фразе; Появляется циклическое прохождение для получения странного вывода - PullRequest
1 голос
/ 02 июня 2019

Я пытаюсь написать код, который делает свинью латынь. Два основных правила таковы:

  • Правило 1: если слово начинается с гласного звука, добавьте в конец слова «ай».
  • Правило 2: если слово начинается с согласного звука, переместите согласный в конец слова. Затем добавьте в конец слова «ай» звук.

Есть некоторые крайние правила, которые я не собираюсь здесь описывать, но они включены в мой код.

const pigify = (str) => {
  let sentSplit = str.split(' ')
  let newArray = [];

  for (let i = 0; i < sentSplit.length; i++) {
    let element = sentSplit[i]
    console.log(element)
    // counts 'qu' as a consonant even when it's preceded by a consonant
    if (!['a', 'e', 'i', 'o', 'u'].includes(element[0]) && (element.slice(1, 3) === 'qu')) {
      newArray.push(`${element.slice(3)}${element.slice(0,3)}ay`)
    }

    // translates a word beginning with three consonants 
    // counts 'sch' as a single phoneme
    else if (!['a', 'e', 'i', 'o', 'u'].includes(element[0]) &&
      !['a', 'e', 'i', 'o', 'u'].includes(element[1]) &&
      !['a', 'e', 'i', 'o', 'u'].includes(element[2]) ||
      (element.slice(0, 3) === 'sch')
    ) {
      newArray.push(`${element.slice(3)}${element.slice(0,3)}ay`)
    }

    // translates a word beginning with two consonants
    // counts 'qu' as a single phoneme
    else if (!['a', 'e', 'i', 'o', 'u'].includes(element[0]) &&
      !['a', 'e', 'i', 'o', 'u'].includes(element[1]) ||
      (element.slice(0, 2) === 'qu')
    ) {
      newArray.push(`${str.slice(2)}${str.slice(0,2)}ay`)
    }

    // translates a word beginning with a consonant
    else if (!['a', 'e', 'i', 'o', 'u'].includes(element[0])) {
      newArray.push(`${str.slice(1)}${str[0]}ay`)
    }

    // translates a word beginning with a vowel
    else if (['a', 'e', 'i', 'o', 'u'].includes(element[0])) {
      newArray.push(`${element}ay`)
    }
  }
  return newArray.join('')
}


const pigLatinString = pigify('the quick brown fox');
console.log(pigLatinString);

Я ожидаю, что вывод переменной pigLatinString будет:

ethay ickquay ownbray oxfay

но вместо этого мой код возвращает:

'e quick brown foxthaye quick brown foxthaye quick brown foxthayhe quick brown foxtay'

Что я делаю не так?

1 Ответ

0 голосов
/ 02 июня 2019

Не охватывает крайние случаи:

Рассмотрите возможность разбиения разных «задач» на разные «функции» для удобства чтения и отладки.

  const startsWithVowel = letter => {
    const vowels = ['a', 'e', 'i', 'o', 'u'];
    if (vowels.includes(letter)) return true;
  };

  const turnPigLatin = str => {
    const firstLetter = str.charAt(0);
    if (startsWithVowel(firstLetter)) {
      return str + 'yay';
    } else {
      return str.substr(1) + str.charAt(0) + 'ay';
    }
  };

  const pigify = sentence => {
    const words = sentence.split(' ');
    return words.map(word => turnPigLatin(word)).join(' ');
  };

  console.log(pigify('The quick brown fox'));
...