当我的JavaScript将常规文本转换为Morse代码时,我遇到了一个问题。
当我试图运行我的函数时,输入文本“我爱JS”似乎什么都没有发生。
这是我的密码:
$("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
发布于 2015-06-30 03:13:02
首先,我们要指出几点:
tam()没有return语句,这就是为什么otext从未得到附加文本(甚至不正确的文本)的原因。tam()将返回的结果字符串设置一个单独的字符串,而不是替换相同字符串上的字符。我不会在这里这样做,因为你的问题是它为什么什么都不回,你说你无论如何都喜欢问题:)现在,要使这一工作:
for中的第一个tam()太短了。它应该覆盖整个tam()的主体,否则它只会将值赋值给letter和morse,但是循环之后只有最后的值才能存活,并且您只能替换转换表中的最后一个字符。因此,将该循环的结束支撑移到您函数的最后一行。string.replace()将返回一个新字符串,并按照您的要求替换它,但是它不会更改调用replace的字符串对象。因此,您对from.replace()的两个调用都应该是这样的:
from = from.replace(...);from.replace()语句中的from.replace()替换为letter.toLowerCase(),以便replace()能够找到它们。tam()的最后一行( for循环之后)插入以下内容:
return from;就这样!
编辑:
使用正则表达式可能会无意中将较短的morse序列的部分替换为较长的序列,从而破坏它们。例如,"ART“一词翻译为”.-/.-“。但是当使用regex把它翻译回来时,当字母"A“被替换成序列时,你将得到”A/A/-“,而R将被破坏。
要解决这个问题,您需要逐个翻译"m2t“情况下的序列,如下所示:
} 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;发布于 2015-06-30 02:56:06
这是一个半工作版本:http://jsfiddle.net/efvb5wtk/1/。我删除了示例中没有使用的代码。以下是我所做的重要改变的清单:
莫尔斯/文本转换发生在for循环中。这是:
for (i = 0; i < textandmorse.length; i++) {
var letter = textandmorse[i].letter;
var morse = textandmorse[i].morse;
}只会将letter和morse设置为textandmorse中的最后一个条目。在for循环中需要更多的代码来完成任何事情。
我向tam函数添加了一个返回值。如果没有那条线
var res = tam(itext.val(), 1, true, "t2m");将始终将undefined分配给res。
我更改了循环以一次处理字符串一个字母。正如南诺雷所提到的,如果你直接替换.和-字符,那么替换它们将是一个问题。
如果莫尔斯字母之间没有隔阂,那么要翻译回去要困难得多。你将如何区分"ET“和"A"?两者都有“.”的莫尔斯翻译。
https://stackoverflow.com/questions/31128518
复制相似问题