2017-02-10 16 views
1

私はfreecodecamp.comの練習問題のコードをPig Latinとして書いています。 whileループでは、条件が間違っているときにその中のコードの実行を停止する必要があります。私のケースでは、whileループは、繰り返し中にcharas配列の母音を見たときにwhileループ内のコードの実行を停止する必要があります。私のコードは私の視点では正しいと思うが、whileループは母音を見るときに実行を止めないが、charas配列のすべての要素を反復する。ここで ループが正常に動作していない

は、それが結果として物乞いで「」の文字を移動し、最初の反復I == 1(内2回目の反復後の作業原因

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

として働く私のコード

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

この関数から何を返す必要がありますか? – Weedoze

+0

入力文字列の最初の子音(または子音クラスター)を取り、単語の最後に移動し、接尾辞 "ay"を付けます。母音で始まる単語は、最後に "way"を追加するだけです。 –

答えて

0

あなたの問題はあなたが増分であることです。i。最初の要素を配列の先頭から移動して、iの文字をスキップしているのは、charas[1]charas[0]で、charas[1]charas[2]だったからです。

あなたがコードをステップとcharas配列を検査した場合、あなたはこの出来事見ることができます:

開始状態:

[ "C"、 "A"、 "L"、 "I" を、 "F"、 "O"、 "R"、 "N"、 "I"、 "A" は、】

"c"i1

にインクリメントされる端部に移動されます

[ "A"、 "L"、 "I"、 "F"、 "O"、 "R"、 "N"、 "I"、 "A"、 "C"]

"l"は、位置が1であるため、最後に移動します。 i2

[ "A"、 "I"、 "F"、 "O"、 "R"、 "N"、 "I"、 "A"、 "C"、「にインクリメントされますl "]

"f"は、2にありますので、最後に移動します。 i3

[ "A" にインクリメントされ、 "I"、 "O"、 "R"、 "N"、 "I"、 "A"、 "C"、 "L"、「 f "]

"r"は、3にありますので、最後に移動します。 i4

[ "A"、 "I"、 "O"、 "N"、 "I"、 "A"、 "C"、 "L"、 "F"、「にインクリメントされますR "]は

"i"while条件が"aioniaclfr"が返され、満たされた、位置4です。

期待のようにそれが動作しますあなただけのiを取り除くと、常にcharas[0]を確認した場合:サイドノートとして

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");
<div id="out"></div>

をすれば、whileこのタイプの条件は、無限ループにつながります誰かがすべての子音である文字列を渡すと、それを止めるための母音を決して見つけられないので、文字をまっすぐに入れておくだけです。これを避けるために、私はそれが起こらないことを確認することを確認するために、別のif条件を追加します。

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");
<div id="out"></div>

/[aeiou]+/をどこかで任意の母音1回以上regular expression意味です文字列!!str.match(/[aeiou]+/)matchの結果を否定します。したがって、ifの分岐が続く文字列に母音がない場合は、結果は無効になります。

+0

ありがとうございました。 :) –

+0

[有益な回答を受け入れる](http://stackoverflow.com/help/someone-answers)は常に高く評価されています;) –

1

です)charas [i]は子音 'l'を指します。

+0

私はサイクルの後に懇願の手紙を削除することをお勧めします –

+0

ええ、それは問題です!ありがとうございました:) –

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"));

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"));

のようなあなたのコードを簡素化することができます
+0

ええ、それは問題でした。コードのお兄さんありがとう:) –

関連する問題