运行我的JavaScript时遇到问题,将常规文本转换为摩尔斯电码。
当我尝试运行我的功能时输入文字"我爱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);
});
});
答案 0 :(得分:1)
首先,要指出的一些事项:
正如我在评论中所说,tam()
没有return
声明,这就是为什么otext
永远不会附加文字(甚至是不正确的文字)。
但即使您确实返回了某些内容,转换表也没有小写字符,因此您的大部分文字都无法转换。要解决此问题,您必须将转换表中的文字和每个字母转换为小写
正如我在评论中指出的那样,转换表中有点和连字符这一事实意味着当你用它们的莫尔斯对应物替换它们时,所有先前转换的代码都将被搞砸(即点。对于所述点和连字符,每个字符的连字符将被转换为莫尔斯(morse)。所以,即使你在otext中得到点和连字符,它们也是错的。要解决此问题,您应该为tam()
将返回的结果字符串设置单独的字符串,而不是替换相同字符串上的字符。我不会在这里这样做,因为你的问题是为什么它没有返回任何东西,你说你还是喜欢问题:)
现在让这项工作:
for
中的第一个tam()
太短了。它应该跨越整个tam()
的正文,否则它只会将值赋给letter
和morse
,但在循环之后,只有最后的值才会存在,并且您只能替换转换表中的最后字符。因此,将该循环的结束括号移动到函数的最后一行。
在Javascript中,string.replace()
会返回一个新字符串,其中包含您要求的替换字符,但它不会更改您调用的字符串对象{{1 }}。因此,您对replace
的两次调用应该是这样的:
from.replace()
将转换表中的所有字母字符转换为小写,并将from = from.replace(...);
语句中的letter
替换为from.replace()
,以便letter.toLowerCase()
能够找到他们。
最后,在replace()
的最后一行(在tam()
循环之后,插入此内容:
for
那就是它!
修改:
使用正则表达式可能会无意中将较短莫尔斯序列的部分替换为较长的序列,从而破坏它们。例如,单词&#34; ART&#34;翻译为&#34; .- / .-。/ - &#34;。但是当使用正则表达式来翻译它时,当字母&#34; A&#34;被替换为序列&#34; .-&#34;,你将最终得到&#34; A / A ./-" ;,并且R将被破坏。
要解决此问题,您需要逐个翻译序列,以便#34; m2t&#34;案例,像这样:
return from;
答案 1 :(得分:0)
这是一个半工作版本:http://jsfiddle.net/efvb5wtk/1/。我删除了示例中未使用的代码。以下列出了我所做的重要更改:
Morse /文本转换发生在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
。
我改变了循环,一次处理一个字母的字符串。正如Nannuo Lei所提到的,如果您直接替换,替换.
和-
字符将是一个问题。