while循环不能正常工作

时间:2017-02-10 12:19:53

标签: javascript while-loop

我正在为freecodecamp.com上的一个练习编写代码,称为Pig Latin问题。对于while循环,当条件出错时,它应该停止在其中执行代码。对于我的情况,while循环必须在它发现它在迭代期间看到charas数组中的元音时停止执行其中的代码。我认为我的代码在我看来是正确的,但是当循环没有停止执行时,它会看到一个元音而不是遍历charas数组中的每个元素。

这是我的代码

function translatePigLatin(str) {
  var vowels = ['a','e','i','o','u'];
  var f="";
  var charas = str.split("");
  if(vowels.indexOf(charas[0])!==-1) {
      // vowel
    charas.push("w");
    charas.push("a");
    charas.push("y");
    f = charas.join("");
  } else {
    //if first letter  is a consonant or cluster of consonants
    var i = 0;
    while(vowels.indexOf(charas[i]) ===-1) {
     charas.push(charas[i]);
     charas.splice(i,1);
     i = i+1;
     }    
   charas.push('a');
   charas.push('y');
   f  = charas.join("");   
  }
  return f;
}

translatePigLatin("california");

4 个答案:

答案 0 :(得分:1)

它起着工作原因

 charas.push(charas[i]);
 charas.splice(i,1);
 i = i+1;

在第一次迭代后,它移动了一个'作为结果的乞讨信i == 1(在第二次迭代中)charas [i]指的是辅音' l'。

答案 1 :(得分:0)

您尚未添加退出while循环的条件,请使用i <= length of charas。请查看下面的代码段。

function translatePigLatin(str) {
  var vowels = ['a', 'e', 'i', 'o', 'u'];
  var f = "";
  var charas = str.split("");

  if (vowels.indexOf(charas[0]) !== -1) {
    // vowel
    charas.push("w", "a", "y");
    f = charas.join("");
  } else {
    //if first letter  is a consonant or cluster of consonants
    var i = 0;
    var len = charas.length;
    while (vowels.indexOf(charas[i]) === -1 && i <= len) {
      charas.push(charas[i]);
      charas.splice(i, 1);
      i++;
    }
    charas.push('a', 'y');
    f = charas.join("");
  }
  return f;
}

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

答案 2 :(得分:0)

问题是你正在迭代并同时修改同一个数组

您可以像这样简化代码

function translatePigLatin(str) {
  var vowels = ['a', 'e', 'i', 'o', 'u'];
  //start with vowel
  if (vowels.indexOf(str[0]) !== -1) {
    return str + "way";
  }

  var i = 0;
  var beforeVowel = "";
  var chars = str.split("");
  while (vowels.indexOf(chars[i]) === -1 && i < str.length) {
    beforeVowel += chars[i];
    i++;
  }
  return str.substring(i) + beforeVowel + "ay";
}

console.log(translatePigLatin("california"));
console.log(translatePigLatin("pig"));
console.log(translatePigLatin("eat"));

答案 3 :(得分:0)

您的问题是您增加了i。你从数组的开头移动第一个元素然后递增i你正在跳过一个字母,因为charas[1]现在是charas[0]charas[1]是什么{{{ 1}}。

如果您单步执行代码并检查charas[2]数组,则可以看到这种情况:

开始状态:

  

[&#34; c&#34;,&#34; a&#34;,&#34; l&#34;,&#34; i&#34;,&#34; f&#34;,& #34; o&#34;,&#34; r&#34;,&#34; n&#34;,&#34; i&#34;,&#34; a&#34;]

charas被移到了最后 "c"会增加到i

  

[&#34; a&#34;,&#34; l&#34;,&#34; i&#34;,&#34; f&#34;,&#34; o&#34;,& #34; r&#34;,&#34; n&#34;,&#34;我&#34;,&#34; a&#34;,&#34; c&#34;]

1位于"l"位置,因此会移到最后。 1会增加到i

  

[&#34; a&#34;,&#34; i&#34;,&#34; f&#34;,&#34; o&#34;,&#34; r&#34;,& #34; n&#34;,&#34;我&#34;,&#34; a&#34;,&#34; c&#34;,&#34; l&#34;]

2位于"f"位置,因此会移到最后。 2会增加到i

  

[&#34; a&#34;,&#34; i&#34;,&#34; o&#34;,&#34; r&#34;,&#34; n&#34;,& #34;我&#34;,&#34; a&#34;,&#34; c&#34;,&#34; l&#34;,&#34; f&#34;]

3位于"r"位置,因此会移到最后。 3会增加到i

  

[&#34; a&#34;,&#34; i&#34;,&#34; o&#34;,&#34; n&#34;,&#34; i&#34;,& #34; a&#34;,&#34; c&#34;,&#34; l&#34;,&#34; f&#34;,&#34; r&#34;]

4位于"i"位置,符合4条件,将返回while

如果你只是摆脱"aioniaclfr"并且总是检查i,它会像预期的那样运作:

&#13;
&#13;
charas[0]
&#13;
function translatePigLatin(str) {
  var vowels = ['a','e','i','o','u'];
  var f = "";
  var charas = str.split("");
  if(vowels.indexOf(charas[0]) !== -1) {
    // vowel
    charas.push("w");
    charas.push("a");
    charas.push("y");
    f = charas.join("");
  } else {
    //if first letter  is a consonant or cluster of consonants
    while(vowels.indexOf(charas[0]) === -1) {
     charas.push(charas[0]);
     charas.splice(0,1);
    }
    charas.push('a');
    charas.push('y');
    f = charas.join("");
  }
  return f;
}

document.getElementById('out').textContent = translatePigLatin("california");
&#13;
&#13;
&#13;

作为旁注,这种类型的<div id="out"></div>条件将导致无限循环,如果有人传入一个所有辅音的字符串,它只会继续改变字母,因为它永远不会找到一个元音停下来。为了避免这种情况,我会添加另一个while条件来检查它以确保它不会发生:

&#13;
&#13;
if
&#13;
function translatePigLatin(str) {
  var vowels = ['a','e','i','o','u'];
  var f = "";
  var charas = str.split("");
  if (!str.match(/[aeiou]+/)) {
    // only consonants do something
     f = str + 'ay';
  } else if (vowels.indexOf(charas[0]) !== -1) {
    // vowel
    charas.push("w");
    charas.push("a");
    charas.push("y");
    f = charas.join("");
  } else {
    //if first letter  is a consonant or cluster of consonants
    while(vowels.indexOf(charas[0]) === -1) {
     charas.push(charas[0]);
     charas.splice(0,1);
    }
    charas.push('a');
    charas.push('y');
    f = charas.join("");
  }
  return f;
}

document.getElementById('out').textContent = translatePigLatin("wkrp");
&#13;
&#13;
&#13;

<div id="out"></div>是一个regular expression,意味着字符串中任意位置的任何元音都会/[aeiou]+/中的!否定!str.match(/[aeiou]+/)的结果,所以如果字符串中没有元音,match的分支被跟随。