2017-02-10 3 views
1

Я пишу код для моего одного из упражнений на freecodecamp.com, который называется Pig Latin. Для цикла while он должен прекратить выполнение кода внутри него, когда условие становится неправильным. В моем случае цикл while должен прекратить выполнение кодов внутри него, когда обнаруживает, что он видел гласную в массиве charas во время итерации. Я думаю, что мой код верен в моей точке зрения, но в то время как цикл не останавливает выполнение, когда видит гласную, вместо этого он перебирает каждый элемент массива charas.while loop не работает должным образом

Вот мой код

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». Если слово начинается с гласного, вы просто добавляете «путь» до конца. –

ответ

0

Ваша проблема в том, что вы увеличиваете i. Вы перемещаете первый элемент с начала массива, а затем увеличиваете i, вы пропускаете письмо, потому что то, что было charas[1], теперь charas[0] и что такое charas[1] было charas[2].

Если вы шагаете через код и проверить charas массив, который вы можете увидеть, как это происходит:

Начиная состояние:

[ «с», «а», «л», «я» , "е", "о", "г", "п", "я", "а"]

"c" получает перемещается в конец i увеличивается до 1

[ "а", "л", "I", "F", "о", "г", "п", "я", "а", "в"]

"l" находится в позиции 1, поэтому он перемещается в конец. i увеличивается до 2

[ "A", "I", "F", "о", "R", "N", "я", "а", "в", " л "]

"f" находится в положении 2, поэтому он получает перемещается в конец. i увеличивается до 3

[ "а", "я", "о", "г", "п", "я", "а", "в", "л", " е "]

"r" находится в положении 3, поэтому он получает перемещается в конец. i увеличивается до 4

[ "а", "я", "о", "п", "я", "а", "в", "л", "F", " г "]

"i" находится в положении 4, условие удовлетворяется while, "aioniaclfr" будут возвращены.

Если вы просто избавиться от 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]+/ является regular expression смыслом любого гласного один или несколько раз в любом месте в string ! в !str.match(/[aeiou]+/) отрицает результат match, поэтому, если в строке нет гласных, то следует следовать за веткой if.

+0

Спасибо за объяснение. :) –

+0

[Повысить голос и/или принять полезные ответы] (http://stackoverflow.com/help/someone-answers) всегда приветствуется;) –

1

Он работает в качестве рабочей причины

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

После первой итерации двигаться «а» письмо на попрошайничество как результат я == 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

Да, в этом была проблема. Спасибо за код брата :) –

Смежные вопросы