将字符串更改为数字并将数字相加

时间:2015-07-12 20:11:57

标签: javascript regex

这就是我所拥有的:

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

请尝试解释一下,我很难理解这一点。

7 个答案:

答案 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;目的,你的代码应该被重写

工作片段:

&#13;
&#13;
// 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;
&#13;
&#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。

查看修改后的代码段,打开控制台日志,看看会发生什么。 以此为契机,学习如何调试。

&#13;
&#13;
// 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;
&#13;
&#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中进行一些空检查和/或类型检查,但我认为这很简单。