我无法理解这里的逻辑

时间:2017-07-30 12:44:25

标签: javascript ecmascript-6

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

结果:手套

预期:oveglay

第一次通过函数prepareCononants

   str      = 'glove'
   prepared = 'loveg'

第二次

   str      = 'loveg'
   prepared = 'ovegl'

第三次

 str      = 'ovegal'
 prepared = ''

准备好的条件。长度> 0未满足,因此应返回str +'ay'

但是没有,它会返回到这里而不是返回到translatePigLatin函数。 它将递归调用函数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:我做了另一个实现,但我无法理解这里的问题。

1 个答案:

答案 0 :(得分:2)

问题在于:

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

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

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

这输出" oveglay"