【问题标题】:Pig Latin Translator - JavaScript猪拉丁语翻译器 - JavaScript
【发布时间】:2012-04-24 22:24:42
【问题描述】:

因此,对于我的 cit 课程,我必须编写一个猪拉丁语转换器程序,但我对如何同时使用数组和字符串感到非常困惑。 转换规则很简单,只需将单词的第一个字母移到后面,然后加上ay。例如:英语中的地狱将是猪拉丁语中的 ellhay 到目前为止我有这个:

<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>

如果能得到任何帮助,我将不胜感激!

【问题讨论】:

  • 解决问题的第一步是学会提出正确的问题。 究竟是什么让您感到困惑?您可能会发现自己找到了回答自己问题的工具。
  • 不回答您的问题,但请注意您正在为 inputtokensoutputlen 和 @ 创建 全局 变量987654328@ 在您的 translation 函数中(单词 fucntion [原文如此] 也拼写错误,但至少您会在控制台中得到一个错误)。您已经使用var 声明了delimiter,但其末尾的; 结束了var 语句,因此以下几个语句只是您成为牺牲品的赋值(i; 除外) The Horror of Implicit Globals。只是 FWIW。
  • @32bitkid 我对如何在数组中移动字母感到困惑。我知道如何将第一个字母与单词分开,但不知道如何在最后移动它
  • 请改变你所有的变量..我们不想要全球范围的囤积
  • @Gcap:没有必要在数组中移动字母。一旦你得到了单词的字符串数组,你从split正确地得到了(除了我上面的注释中的东西),看看使用String#substring

标签: javascript


【解决方案1】:
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")

【讨论】:

    【解决方案2】:

    我认为您真正需要注意的两件事是substring() 方法和字符串连接(将两个字符串加在一起)。由于从您对split() 的调用返回的数组中的所有对象都是字符串,因此简单的字符串连接可以正常工作。例如,使用这两种方法,您可以将字符串的第一个字母移动到末尾,如下所示:

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

    【讨论】:

    • 非常感谢!这很有帮助!
    • 我还想知道如何将输出保存在 textarea 框中。假设我输入“are”,然后在 textarea 中将其转换为“reaay”,然后输入“hello” textarea 应该在它下面输出“ellohay”和“reaay”。你认为你也可以帮助我吗?
    • 提示:.substring(0, 1) === .charAt(0)
    【解决方案3】:

    这段代码是基本的,但它可以工作。首先,注意以元音开头的单词。否则,对于以一个或多个辅音开头的单词,确定辅音的数量并将它们移到末尾。

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

    【讨论】:

      【解决方案4】:

      如果您正在处理数组,这可能有点复杂,但它简洁紧凑:

      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');
      };
      

      【讨论】:

      • 您在什么浏览器上测试?它在 Firefox 中对我来说很好用
      【解决方案5】:

      这是我的解决方案

      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;
      }
      

      【讨论】:

        【解决方案6】:

        另一种方法,使用单独的函数作为真假开关。

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

        【讨论】:

          【解决方案7】:

          这是我的解决方案代码:

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

          【讨论】:

            【解决方案8】:

            另一种方式。

            String.prototype.toPigLatin = function()
            {
                var str = "";
                this.toString().split(' ').forEach(function(word)
                {
                    str += (toPigLatin(word) + ' ').toString();
                });
                return str.slice(0, -1);
            };
            
            function toPigLatin(word)
            {
                //Does the word already start with a vowel?
                if(word.charAt(0).match(/a*e*i*o*u*A*E*I*O*U*/g)[0])
                {
                    return word;
                }
            
                //Match Anything before the firt vowel.
                var front = word.match(/^(?:[^a?e?i?o?u?A?E?I?O?U?])+/g);
                return (word.replace(front, "") + front + (word.match(/[a-z]+/g) ? 'a' : '')).toString();
            }
            

            【讨论】:

              【解决方案9】:

              猪拉丁的另一种方式:

              function translatePigLatin(str) {
                let vowels = /[aeiou]/g;
                var n = str.search(vowels); //will find the index of vowels
                switch (n){
                  case 0:
                    str = str+"way";
                    break;
                  case -1:
                    str = str+"ay";
                    break;
                  default:
                    str = str.slice(n)+str.slice(0,n)+"ay";
                    break;
                }
                return str;
              }
              
              console.log(translatePigLatin("rhythm"));

              【讨论】:

                【解决方案10】:

                你的朋友是字符串函数.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!"
                

                【讨论】:

                • 使用split 拆分所有字符是多余的。只需使用substring(0, 1)substring(1)。是的,通常最好不要用完整的解决方案来回答家庭作业问题(即使你在顶部加上警告也不要)。
                • 技术上isa应该是遥不可及。
                • 感谢 google 将这些页面编入索引,以便教授可以搜索使用过的代码呵呵。
                • @T.J.Crowder:你说得对,但我养成了这样做的习惯,因为它支持我经常使用的功能,例如.slice(从后面负索引,这里不需要) 、.filter(查找/删除具有特征的字母)、.forEach(而不是 for 循环)、.every(每个字母都是大写的吗?)、.some(是一组坏字符中的某个字符吗? ), .map (凯撒移位), .reduce.
                • @ninjagecko:我真的很喜欢电钻。我用它们做所有事情:在墙上钻孔、敲钉子、洗碗…… ;-)
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多