Ваша проблема в том, что вы увеличиваете 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
.
Что следует вернуть из этой функции? – Weedoze
Он принимает первый согласный (или согласный кластер) входной строки, перемещает его до конца слова и суффиксы «ay». Если слово начинается с гласного, вы просто добавляете «путь» до конца. –