这就是我所拥有的:
// My globals
var output = $("#output");
function m_o() {
// var input = $("#input");
// var value = input.val();
var value = "SCORE";
// Setting
var r_o = {
// Setting #customizing
A: "1",
B: "2",
C: "3",
D: "4",
E: "5",
F: "6",
G: "7",
H: "8",
I: "9",
J: "10",
K: "11",
L: "12",
M: "13",
N: "14",
O: "15",
P: "16",
Q: "17",
R: "18",
S: "19",
T: "20",
U: "21",
V: "22",
W: "23",
X: "24",
Y: "25",
Z: "26",
};
// Translating
var re = new RegExp(Object.keys(r_o).join("|"), "g");
value = value.replace(re, function (matched) {
return r_o[matched];
});
value = parseInt(value.split("").join(" + "), 10);
output.val(value);
}
<!doctype html>
<html>
<head>
<title>5X Script</title>
</head>
<body>
<!--<textarea id="input">
</textarea>-->
<input type="button" value="Translate" onclick="m_o()"/>
<textarea id="output">
</textarea>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
</html>
按翻译按钮后,texarea将显示1
。
这不应该发生什么。我们的输入为SCORE
,因此结果应为“19 + 3 + 15 + 18 + 5”。换句话说,输出应该等于60
。
请尝试解释一下,我很难理解这一点。
答案 0 :(得分:3)
您可以避免存储"letter":"number"
映射,利用Ascii值,只需转换大写并减去64
function m_o() {
var value ="SCORE";
var finalCount = 0;
for (var i = 0; i < value.length; i++) {
finalCount += (value.toUpperCase().charCodeAt(i) - 64);
}
$("#output").html(finalCount);
}
点击 Fiddle Demo
答案 1 :(得分:1)
我觉得你过于复杂了。您可以使用循环遍历字符串中的每个字符。
对于每个字母,检查它是否存在于r_o
对象中,如果是,则从对象中获取相应的值并将其添加到总数中。
这是一个例子
// Translating
var length = value.length; //how many characters in the string?
var total = 0; //what you will return
for(let i=0; i < value.length; i++) //for each character in the string
{
var m = value[i];
if(r_o.hasOwnProperty(m)) total += r_o[m];
//if the char is in the obj, add the corresponding value
}
output.val(total); //return the new total
答案 2 :(得分:1)
据我所知,parseInt无法像你一样评估表达式。无论如何,我建议使用String.prototype.charCodeAt
以使您的代码更具可读性并更改您的函数和变量名称。
编辑:只是为了让答案更加明确:您传递给parseInt
的内容实际上是一个包含&#34; 1 + 2 + 3 + 4
&#等表达式的字符串34; ...
parseInt
尝试做的只是解析它得到的第一个整数,在本例中为1
。正如对方告诉你的那样,你的解决方案似乎非常复杂,你应该改变它,但如果你真的对这个解决方案感到满意(你不应该),你可以改变:
value = parseInt(value.split("").join(" + "), 10);
使用:
eval("value = " + value.split("").join(" + ") + ";");
您的代码中确实存在另一个错误:您正在执行split("")
。当您用2位数字替换字符时会出现错误,例如19(这就是为什么即使使用我的解决方案,您也会得到33而不是60)。您的RegEx将S
替换为19
,但是当您拆分并加入时,您的2位数字将被拆分为1和9.一个简单的解决方案可能是在替换时添加空格然后再使用它分割值,替换:
return r_o[matched];
与
return ' ' + r_o[matched];
和
eval("value = " + value.split("").join(" + ") + ";");
与
eval("value = " + value.split(" ").join(" + ") + ";");
小解释:现在,当您进行替换时,实际上是用<space><number>
替换了一个角色。然后,您可以使用此空间正确分割值,然后使用+
运算符将它们连接起来。最后,您评估字符串"value = 1 + 2 + 3 + 4;
。
这个答案仅适用于&#34;教育&#34;目的,你的代码应该被重写
工作片段:
// My globals
var output = $("#output");
function m_o() {
// var input = $("#input");
// var value = input.val();
var value = "SCORE";
// Setting
var r_o = {
// Setting #customizing
A: "1",
B: "2",
C: "3",
D: "4",
E: "5",
F: "6",
G: "7",
H: "8",
I: "9",
J: "10",
K: "11",
L: "12",
M: "13",
N: "14",
O: "15",
P: "16",
Q: "17",
R: "18",
S: "19",
T: "20",
U: "21",
V: "22",
W: "23",
X: "24",
Y: "25",
Z: "26",
};
// Translating
var re = new RegExp(Object.keys(r_o).join("|"), "g");
value = value.replace(re, function (matched) {
return ' ' + r_o[matched];
});
eval("value = " + value.split(' ').join(" + ") + ";");
output.val(value);
}
&#13;
<!doctype html>
<html>
<head>
<title>5X Script</title>
</head>
<body>
<!--<textarea id="input">
</textarea>-->
<input type="button" value="Translate" onclick="m_o()"/>
<textarea id="output">
</textarea>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
</html>
&#13;
答案 3 :(得分:1)
由于此parseInt
的行为,您得1
作为输出:
如果
parseInt
遇到的字符不是数字 指定的基数,它忽略它和所有后续字符和 返回解析到该点的整数值。
我认为您需要使用eval
并在每次替换前使用+
:
将return r_o[matched];
替换为return "+"+r_o[matched];
并使用:
value = parseInt(eval(value), 10);
或者,如果您不考虑eval
,这是一个自定义函数:
function sumup(s){
var total= 0, s= s.match(/\+\d+/g) || [];
while(s.length){
total+= parseInt(s.shift());
}
return total;
}
这是您更新的代码段:
// My globals
var output = $("#output");
function sumup(s){
var total= 0, s= s.match(/\+\d+/g) || [];
while(s.length){
total+= parseInt(s.shift());
}
return total;
}
function m_o() {
// var input = $("#input");
// var value = input.val();
var value = "SCORE";
// Setting
var r_o = {
// Setting #customizing
A: "1",
B: "2",
C: "3",
D: "4",
E: "5",
F: "6",
G: "7",
H: "8",
I: "9",
J: "10",
K: "11",
L: "12",
M: "13",
N: "14",
O: "15",
P: "16",
Q: "17",
R: "18",
S: "19",
T: "20",
U: "21",
V: "22",
W: "23",
X: "24",
Y: "25",
Z: "26",
};
// Translating
var re = new RegExp(Object.keys(r_o).join("|"), "g");
value = value.replace(re, function (matched) {
return "+"+r_o[matched];
});
value = sumup(value);
output.val(value);
}
<!doctype html>
<html>
<head>
<title>5X Script</title>
</head>
<body>
<!--<textarea id="input">
</textarea>-->
<input type="button" value="Translate" onclick="m_o()"/>
<textarea id="output">
</textarea>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
</html>
答案 4 :(得分:1)
你想要的是这样的
var value = "SCORE";
// Setting
var r_o = {
// Setting #customizing
A: "1",
B: "2",
C: "3",
D: "4",
E: "5",
F: "6",
G: "7",
H: "8",
I: "9",
J: "10",
K: "11",
L: "12",
M: "13",
N: "14",
O: "15",
P: "16",
Q: "17",
R: "18",
S: "19",
T: "20",
U: "21",
V: "22",
W: "23",
X: "24",
Y: "25",
Z: "26",
};
// Translating
var re = new RegExp(Object.keys(r_o).join("|"), "g");
var output =0;
value.replace(re, function (matched) {
output += parseInt(r_o[matched]);
});
alert(output);
答案 5 :(得分:0)
基本上价值parseInt
&#34;见&#34;&#34;是&#34; 1 + ...&#34;并解析1。
查看修改后的代码段,打开控制台日志,看看会发生什么。 以此为契机,学习如何调试。
// My globals
var output = $("#output");
function m_o() {
// var input = $("#input");
// var value = input.val();
var value = "SCORE";
// Setting
var r_o = {
// Setting #customizing
A: "1",
B: "2",
C: "3",
D: "4",
E: "5",
F: "6",
G: "7",
H: "8",
I: "9",
J: "10",
K: "11",
L: "12",
M: "13",
N: "14",
O: "15",
P: "16",
Q: "17",
R: "18",
S: "19",
T: "20",
U: "21",
V: "22",
W: "23",
X: "24",
Y: "25",
Z: "26",
};
// Translating
var re = new RegExp(Object.keys(r_o).join("|"), "g");
value = value.replace(re, function (matched) {
console.log(matched);
return r_o[matched];
});
console.log(value);
var t = value.split("").join(" + ");
console.log('About to "parseInt":', t);
value = parseInt(t, 10);
console.log(value);
output.val(value);
}
&#13;
<!doctype html>
<html>
<head>
<title>5X Script</title>
</head>
<body>
<!--<textarea id="input">
</textarea>-->
<input type="button" value="Translate" onclick="m_o()"/>
<textarea id="output">
</textarea>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
</html>
&#13;
答案 6 :(得分:0)
这是一个相当简单的方法:
var charVal = function(c) {return c.charCodeAt(0) - 'A'.charCodeAt(0) + 1;};
var add = function(a, b) {return a + b;};
var convert = function(s) {return s.split('').map(charVal).reduce(add, 0);};
convert('SCORE'); //=> 60
您可能希望在charVal
中进行一些边界检查,并在convert
中进行一些空检查和/或类型检查,但我认为这很简单。