2012-04-24 5 views
2

Итак, для моего класса cit я должен написать программу конвертера для конвертеров pig, и я действительно запутался в том, как использовать массивы и строки вместе. Правила конверсии просты, вы просто переместите первую букву слова на спину, а затем добавьте ay. например: ад на английском языке будет ellhay в свинью Латинской меня это до сих пор:Pig Latin Translator - JavaScript

<form name="form"> 
<p>English word/sentence:</p> <input type="text" id="english" required="required" size="80" /> <br /> 
<input type="button" value="Translate!" onClick="translation()" /> 
<p>Pig Latin translation:</p> <textarea name="piglat" rows="10" cols="60"></textarea> 
</form> 

<script type="text/javascript"> 
<!-- 
fucntion translation() { 
var delimiter = " "; 
    input = document.form.english.value; 
    tokens = input.split(delimiter); 
    output = []; 
    len = tokens.length; 
    i; 

for (i = 1; i<len; i++){ 
    output.push(input[i]); 
} 
output.push(tokens[0]); 
output = output.join(delimiter); 
} 
//--> 
</script> 

Я бы очень признателен за любую помощь, которую я могу получить!

+0

Первым шагом к решению проблемы учится задать правильный вопрос. Что * точно * сбивает с толку?Вы можете просто найти, что найдете инструменты, чтобы ответить на свой вопрос. –

+0

Не отвечает на ваш вопрос, но обратите внимание, что вы создаете * глобальные * переменные для 'input',' tokens', 'output',' len' и 'i' в вашей функции' translation' (слово ' fucntion' [sic] также ошибочно написана, но по крайней мере вы получите сообщение об ошибке в консоли). Вы объявили 'delimiter' с помощью' var', но ';' в конце этого завершает оператор 'var', поэтому следующие несколько операторов являются просто присваиваниями (кроме' i; '), в которых вы становитесь жертвой к [Ужас неявных глобалов] (http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html). Просто FWIW. –

+0

@ 32bitkid Я смущен тем, как перемещать буквы в массиве, я думаю .. Я знаю, как отделить первую букву от слова, но не как переместить его в конце – Gcap

ответ

3

Я думаю, что эти две вещи, которые вы действительно должны смотреть на такие substring() метод и строка concatentation (добавление двух строк вместе) в целом. Поскольку все объекты в массиве, возвращаемые с вашего вызова до split(), являются строками, простая конкатенация строк отлично работает. Например, с помощью этих двух методов, вы можете переместить первую букву строки до конца с чем-то вроде этого:

var myString = "apple"; 

var newString = mystring.substring(1) + mystring.substring(0,1); 
+0

Большое вам спасибо! это очень помогло! – Gcap

+0

Мне также было интересно, как сохранить выходы, сохраненные в текстовом поле. Скажем, я печатаю «are», а в текстовой области он переводит его на «reaay», а затем я набираю «hello», чтобы textarea выводил «ellohay» и «reaay» под ним .. вы думаете, что можете помочь мне с этим? – Gcap

+0

Совет: '.substring (0, 1) === .charAt (0)' – Ryan

-1

Ваши друзья - это строковая функция .split, а функции массива .join и .slice и .concat.

предупреждение:Ниже приводится полное решение вы можете обратиться к как только вы закончили или потратили слишком много времени.

function letters(word) { 
    return word.split('') 
} 

function pigLatinizeWord(word) { 
    var chars = letters(word); 
    return chars.slice(1).join('') + chars[0] + 'ay'; 
} 

function pigLatinizeSentence(sentence) { 
    return sentence.replace(/\w+/g, pigLatinizeWord) 
} 

Демо:

> pigLatinizeSentence('This, is a test!') 
"hisTay, siay aay esttay!" 
+2

Использование' split' для разделения всех символов является излишним. Просто используйте 'substring (0, 1)' и 'substring (1)'. И да, обычно лучше не отвечать на домашние задания с полными решениями (даже если вы не ставите оговорку наверху). –

+0

_Technically_, ** is ** и ** a ** должен быть отправлен и прочь. – scottm

+0

Благодарим вас за то, что проиндексировали эти страницы Google, чтобы профессионалы могли искать используемый код hehe. – rlemon

1

Если вы боретесь с массивами, это может быть немного сложнее, но это сжато и компактно:

var toPigLatin = function(str) { 
    return str.replace(/(^\w)(.+)/, '$2$1ay'); 
}; 

Демо: http://jsfiddle.net/elclanrs/2ERmg/

Немного улучшенная версия для использования со всеми предложениями:

var toPigLatin = function(str){ 
    return str.replace(/\b(\w)(\w+)\b/g, '$2$1ay'); 
}; 
+0

Ммм ... это делает то, о чем попросил ОП. Почему downvote? – elclanrs

+0

запускает предупреждения «$ + hay» – scottm

+0

в каком браузере вы тестируете? Он отлично работает для меня в firefox – elclanrs

3
function translate(str) { 
    str=str.toLowerCase(); 
    var n =str.search(/[aeiuo]/); 
    switch (n){ 
     case 0: str = str+"way"; break; 
     case -1: str = str+"ay"; break; 
     default : 
     //str= str.substr(n)+str.substr(0,n)+"ay"; 
     str=str.replace(/([^aeiou]*)([aeiou])(\w+)/, "$2$3$1ay"); 
     break; 
    } 
    return str; 

} 


translate("paragraphs") 
1

Вот мое решение

function translatePigLatin(str) { 
    var newStr = str; 
    // if string starts with vowel make 'way' adjustment 
    if (newStr.slice(0,1).match(/[aeiouAEIOU]/)) { 
    newStr = newStr + "way"; 
    } 
    // else, iterate through first consonents to find end of cluster 
    // move consonant cluster to end, and add 'ay' adjustment 
    else { 
    var moveLetters = ""; 
    while (newStr.slice(0,1).match(/[^aeiouAEIOU]/)) { 
     moveLetters += newStr.slice(0,1); 
     newStr = newStr.slice(1, newStr.length); 
    } 
    newStr = newStr + moveLetters + "ay"; 
    } 
    return newStr; 
} 
1

Этот код является основным, но он работает. Во-первых, позаботьтесь о словах, начинающихся с гласных. В противном случае для слов, начинающихся с одного или нескольких согласных, определите количество согласных и переместите их до конца.

function translate(str) { 
    str=str.toLowerCase(); 

    // for words that start with a vowel: 
    if (["a", "e", "i", "o", "u"].indexOf(str[0]) > -1) { 
     return str=str+"way"; 
    } 

    // for words that start with one or more consonants 
    else { 
    //check for multiple consonants 
     for (var i = 0; i<str.length; i++){ 
      if (["a", "e", "i", "o", "u"].indexOf(str[i]) > -1){ 
       var firstcons = str.slice(0, i); 
       var middle = str.slice(i, str.length); 
       str = middle+firstcons+"ay"; 
       break;} 
      } 
    return str;} 
} 

translate("school"); 
0

Другой способ сделать это, используя отдельную функцию как истинного или ложного переключателя.

function translatePigLatin(str) { 

    // returns true only if the first letter in str is a vowel 
    function isVowelFirstLetter() { 
    var vowels = ['a', 'e', 'i', 'o', 'u', 'y']; 
    for (i = 0; i < vowels.length; i++) { 
     if (vowels[i] === str[0]) { 
     return true; 
     } 
    } 
    return false; 
    } 

    // if str begins with vowel case 
    if (isVowelFirstLetter()) { 
    str += 'way'; 
    } 
    else { 
    // consonants to move to the end of string 
    var consonants = ''; 

    while (isVowelFirstLetter() === false) { 
     consonants += str.slice(0,1); 
     // remove consonant from str beginning 
     str = str.slice(1); 
    } 

    str += consonants + 'ay'; 
    } 

    return str; 
} 

translatePigLatin("jstest"); 
0

это мой код решение:

function translatePigLatin(str) { 
var vowel; 
var consonant; 
var n =str.charAt(0); 
vowel=n.match(/[aeiou]/g); 
if(vowel===null) 
{ 
consonant= str.slice(1)+str.charAt(0)+”ay”; 
} 
else 
{ 
consonant= str.slice(0)+”way”; 
} 
var regex = /[aeiou]/gi; 
var vowelIndice = str.indexOf(str.match(regex)[0]); 
if (vowelIndice>=2) 
{ 
consonant = str.substr(vowelIndice) + str.substr(0, vowelIndice) + ‘ay’; 
} 

return consonant; 
} 

translatePigLatin(“gloove”);