首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS文本和Morse码转换器

JS文本和Morse码转换器
EN

Stack Overflow用户
提问于 2015-06-30 02:20:50
回答 2查看 2.2K关注 0票数 1

当我的JavaScript将常规文本转换为Morse代码时,我遇到了一个问题。

当我试图运行我的函数时,输入文本“我爱JS”似乎什么都没有发生。

这是我的密码:

代码语言:javascript
复制
$("body").html('<textarea class="itext"></textarea><br/><text class="otext"></text><br/><button class="convert">Convert!!!</button>');

    $(document).ready(function(){
        var textandmorse = [
        {"letter":'A', 'morse':".-"},
        {"letter":'B', 'morse':"-..."},
        {"letter":'C', 'morse':"-.-."},
        {"letter":'D', 'morse':"-.."},
        {"letter":'E', 'morse':"."},
        {"letter":'F', 'morse':"..-."},
        {"letter":'G', 'morse':"--."},
        {"letter":'H', 'morse':"...."},
        {"letter":'I', 'morse':".."},
        {"letter":'J', 'morse':".---"},
        {"letter":'K', 'morse':"-.-"},
        {"letter":'L', 'morse':".-.."},
        {"letter":'M', 'morse':"--"},
        {"letter":'N', 'morse':"-."},
        {"letter":'O', 'morse':"---"},
        {"letter":'P', 'morse':".--."},
        {"letter":'Q', 'morse':"--.-"},
        {"letter":'R', 'morse':".-."},
        {"letter":'S', 'morse':"..."},
        {"letter":'T', 'morse':"-"},
        {"letter":'U', 'morse':"..-"},
        {"letter":'V', 'morse':"...-"},
        {"letter":'W', 'morse':".--"},
        {"letter":'X', 'morse':"-..-"},
        {"letter":'Y', 'morse':"-.--"},
        {"letter":'Z', 'morse':"--.."},
        {"letter":'1', 'morse':".----"},
        {"letter":'2', 'morse':"..---"},
        {"letter":'3', 'morse':"...--"},
        {"letter":'4', 'morse':"....-"},
        {"letter":'5', 'morse':"....."},
        {"letter":'6', 'morse':"-...."},
        {"letter":'7', 'morse':"--..."},
        {"letter":'8', 'morse':"---.."},
        {"letter":'9', 'morse':"----."},
        {"letter":'0', 'morse':"-----"},
        {"letter":'.', 'morse':".-.-.-"},
        {"letter":',', 'morse':"--..--"},
        {"letter":':', 'morse':"---..."},
        {"letter":'?', 'morse':"..--.."},
        {"letter":'\'', 'morse':".----."},
        {"letter":'-', 'morse':"-....-"},
        {"letter":'/', 'morse':"-..-."},
        {"letter":'(', 'morse':"-.--.-"},
        {"letter":')', 'morse':"-.--.-"},
        {"letter":'"', 'morse':".-..-."},
        {"letter":'@', 'morse':".--.-."},
        {"letter":'=', 'morse':"-...-"},
        {"letter":' ', 'morse':"/"}
        ];
        //var morse2text = [];
        //var text2morse = [];
        /*for (i = 0; i < textandmorse.length; i++) {
            console.log("letter"+textandmorse[i].letter+" morse"+textandmorse[i].morse);
        }*/

        // Replace Function
        String.prototype.replaceArray = function(find, replace) {
            var replaceString = this;
            var regex;
            for (var i = 0; i < find.length; i++) {
                regex = new RegExp(find[i], "g");
                replaceString = replaceString.replace(regex, replace[i]);
            }
            return replaceString;
        };

        // Declare IO Variable
        var itext = $(".itext");
        var otext = $(".otext");
        var brun = $(".convert");

        // Function Text And Morse
        function tam(from, metode, log, type) {
            for (i = 0; i < textandmorse.length; i++) {
                var letter = textandmorse[i].letter;
                var morse = textandmorse[i].morse;
            }

            if (metode === 1) {
                if (type === "t2m") {
                    from.replace(letter, morse);
                } else if (type === "m2t") {
                    from.replace(morse, letter);
                }
            } else if (metode === 2) {
                if (type === "t2m") {
                    from.replaceArray(letter, morse);
                } else if (type === "m2t") {
                    from.replaceArray(morse, letter);
                }
            }

            if (log === true) {
                console.log(letter + "  ~  " + morse);
            } else {
                console.log("It's Worked ???");
            }
        }

        // Run
        brun.click(function() {
            var res = tam(itext.val(), 1, true, "t2m");
            otext.append(res);
        });

    });

JSFiddle

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-30 03:13:02

首先,我们要指出几点:

  1. 正如我在评论中所说的,tam()没有return语句,这就是为什么otext从未得到附加文本(甚至不正确的文本)的原因。
  2. 但是,即使您确实返回了某些内容,转换表也没有小写字符,因此您的大部分文本不会被转换。要解决这一问题,必须将文本和转换表中的每个字母转换为小写。
  3. 正如我在注释中所指出的那样,转换表中有点和连字符的事实意味着,当您用它们的Morse对应方替换它们时,所有以前转换的代码都会被搞乱(即。每个字符的点和连字符将转换为morse表示所述点和连字符)。因此,即使你在图文中得到了点和连字符,它们也是错误的。要解决这个问题,您应该为tam()将返回的结果字符串设置一个单独的字符串,而不是替换相同字符串上的字符。我不会在这里这样做,因为你的问题是它为什么什么都不回,你说你无论如何都喜欢问题:)

现在,要使这一工作:

  1. for中的第一个tam()太短了。它应该覆盖整个tam()的主体,否则它只会将值赋值给lettermorse,但是循环之后只有最后的值才能存活,并且您只能替换转换表中的最后一个字符。因此,将该循环的结束支撑移到您函数的最后一行。
  2. 在Javascript中,string.replace()将返回一个新字符串,并按照您的要求替换它,但是它不会更改调用replace的字符串对象。因此,您对from.replace()的两个调用都应该是这样的: from = from.replace(...);
  3. 将转换表中的所有字母字符转换为小写,并将from.replace()语句中的from.replace()替换为letter.toLowerCase(),以便replace()能够找到它们。
  4. 最后,在tam()的最后一行( for循环之后)插入以下内容: return from;

就这样!

编辑:

使用正则表达式可能会无意中将较短的morse序列的部分替换为较长的序列,从而破坏它们。例如,"ART“一词翻译为”.-/.-“。但是当使用regex把它翻译回来时,当字母"A“被替换成序列时,你将得到”A/A/-“,而R将被破坏。

要解决这个问题,您需要逐个翻译"m2t“情况下的序列,如下所示:

代码语言:javascript
复制
  } else if ( type === "m2t" ) {
            var from = tidyMorse(froml).replace(/\s+/g, "");
            var outm = '';

            var morseCodes = from.split('/');
            for (j = 0; j < morseCodes.length; j++) {
                for (i = 0; i < textandmorse.length; i++) {
                    if (morseCodes[j] == textandmorse[i].morse) {
                        outm = outm + textandmorse[i].letter;
                        break;
                    }
                }
            }
            return outm;

在JSFiddle上检查一下

票数 1
EN

Stack Overflow用户

发布于 2015-06-30 02:56:06

这是一个半工作版本:http://jsfiddle.net/efvb5wtk/1/。我删除了示例中没有使用的代码。以下是我所做的重要改变的清单:

莫尔斯/文本转换发生在for循环中。这是:

代码语言:javascript
复制
for (i = 0; i < textandmorse.length; i++) {
    var letter = textandmorse[i].letter;
    var morse = textandmorse[i].morse;
}

只会将lettermorse设置为textandmorse中的最后一个条目。在for循环中需要更多的代码来完成任何事情。

我向tam函数添加了一个返回值。如果没有那条线

代码语言:javascript
复制
var res = tam(itext.val(), 1, true, "t2m");

将始终将undefined分配给res

我更改了循环以一次处理字符串一个字母。正如南诺雷所提到的,如果你直接替换.-字符,那么替换它们将是一个问题。

如果莫尔斯字母之间没有隔阂,那么要翻译回去要困难得多。你将如何区分"ET“和"A"?两者都有“.”的莫尔斯翻译。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31128518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档