我写了一个函数转换为PigLatin。

结果:手套

预期:oveglay

第一次通过函数prepareCononants时

   str      = 'glove'
   prepared = 'loveg'


第二次

   str      = 'loveg'
   prepared = 'ovegl'


第三次

 str      = 'ovegal'
 prepared = ''


条件prepare.length> 0不满足,所以它应该返回str +'ay'

但不,它将返回此处,而是返回translatePigLatin函数。
它将以比我预期多2倍的方式递归调用函数prepareCononants

if(prepared.length > 0) {
    debugger;
    prepareCononants(prepared);
  }

  debugger;//here

  return str + "ay";




码:



function translatePigLatin(str) {
  let word = prepareVowels(str);

  if(word.length > 0) {
    return word;
  }

 return prepareCononants(str);

}

function prepareVowels(str) {
    let vowels = [
    'a',    'e',
    'i',    'o',
    'u'
  ];

  return vowels.map((vowel) => {
                if(vowel === str[0]) {
                    return str + 'way';
                  }
                })
               .filter((word) => {
                  return word != null;
                })
               .toString();
}

function prepareCononants(str) {
  debugger;
  let consonants = [
    'b',    'c',
    'd',    'f',
    'g',    'h',
    'j',    'k',
    'l',    'm',
    'n',    'p',
    'q',    'r',
    's',    't',
    'v',    'w',
    'x',    'y',
    'z'
  ];

  let prepared = consonants.map((val) => {
    if(str[0] === val) {
      let word  = str.substring(1, str.length);
      word     += str[0];
      return word;
    }})
   .filter((word) => {
      return word !== 'undefined';
    })
   .toString()
   .replace(/,/g,'');

  if(prepared.length > 0) {
    debugger;
    prepareCononants(prepared);
  }
  debugger;

  return str + "ay";
}


 console.log(translatePigLatin("glove"));





PS:我做了另一种实现,但是我在这里不明白问题所在。

最佳答案

问题是这样的:

if (prepared.length > 0) {
    prepareCononants(prepared);
}
return str + "ay";


您仍在再次执行该功能,但返回第一个结果。你应该做:

if (prepared.length > 0) {
    return prepareCononants(prepared);
}
return str + "ay";


输出“ oveglay”

关于javascript - 我不明白这里的逻辑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45399952/

10-12 00:13