我正在为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");
答案 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
,它会像预期的那样运作:
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;
作为旁注,这种类型的<div id="out"></div>
条件将导致无限循环,如果有人传入一个所有辅音的字符串,它只会继续改变字母,因为它永远不会找到一个元音停下来。为了避免这种情况,我会添加另一个while
条件来检查它以确保它不会发生:
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;
<div id="out"></div>
是一个regular expression,意味着字符串中任意位置的任何元音都会/[aeiou]+/
中的!
否定!str.match(/[aeiou]+/)
的结果,所以如果字符串中没有元音,match
的分支被跟随。