Начинающий применяет троичный оператор в Javascript для Pig Latin, но не могу понять, почему он не работает - PullRequest
0 голосов
/ 08 октября 2019

Я застрял, выясняя, почему троичный оператор не будет возвращать отрицательный результат, и не могу понять, почему. Вот код:

function translatePigLatin(str) {
  let reg=/[aeiou]/gi;
  let firstVowel = str.indexOf(str.match(reg)[0]);
  //console.log(firstVowel);

  return str.match(reg) == 1 ? play(str) : str + "ay";
  
  function play(str) {
    if(str[0].match(reg)){
      return str+"way";
    }else if(str[1].match(reg)){
      return str.slice(1) + str[0]+ "ay"
    } else if(str.match(reg)!==null){
      return str.slice(firstVowel) +str.slice(0,firstVowel)+"ay";
    } else {
      return str+"ay";
    }
}
}
console.log(translatePigLatin("consonant"));
console.log(translatePigLatin("eight"));
console.log(translatePigLatin("glove"));
console.log(translatePigLatin("hmm"));

Последний тест с "hmm" приводит к ошибке: "Ошибка типа: str.match (...) равен нулю".

Мне легче понять, что здесь может помочь нулевое значение, но не уверен, имеет ли оно смысл и как это сделать.

Как мне лучше понять это и заставить его работать? Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

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

  • Я забрал ваше else, если вы все равно возвращаете значение в каждом условии, поэтому он не будет читать ни один код после возврата.
  • Я не видел причины для двух инкапсулированных функций.
  • Я также использовал литералы шаблона.
function translatePigLatin(str) {
   const reg = /[aeiou]/gi;
   const match = str.match(reg);
   const firstVowel = match ? str.indexOf(match[0]) : null;

   if (!firstVowel) {
     return `${str}ay`;
   }

   if (str[0].match(reg)) {
     return `${str}way`;
   }

   if (str[1].match(reg)) {
     return `${str.slice(1)}${str[0]}ay`;
   }

   if (str.match(reg)!== null) {
     return `${str.slice(firstVowel)}${str.slice(0,firstVowel)}ay`;
   }
 };

 console.log(translatePigLatin("consonant"));
 console.log(translatePigLatin("eight"));
 console.log(translatePigLatin("glove"));
 console.log(translatePigLatin("hmm"));
0 голосов
/ 08 октября 2019

Нет совпадения (без гласного в "хм"). Так что str.match(reg) будет нулевым. Таким образом, вы не можете получить доступ к str.match(reg)[0]. Переместите инициализацию firstVowel в if condition.

function translatePigLatin(str) {
  let reg=/[aeiou]/gi;
  return str.match(reg) != null ? play(str) : str + "ay";
  
  function play(str) {
    if(str[0].match(reg)){
      return str+"way";
    }else if(str[1].match(reg)){
      return str.slice(1) + str[0]+ "ay"
    } else if(str.match(reg)!==null){
      let firstVowel = str.indexOf(str.match(reg)[0]);
      return str.slice(firstVowel) +str.slice(0,firstVowel)+"ay";
    } else {
      return str+"ay";
    }
}
}
console.log(translatePigLatin("consonant"));
console.log(translatePigLatin("eight"));
console.log(translatePigLatin("glove"));
console.log(translatePigLatin("hmm"));
...