Voici ce que j'ai:

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

Une fois que vous avez appuyé sur le bouton Traduire , le texarea affichera 1.

Ce n'est pas ce qui devrait arriver. Notre entrée est SCORE, donc le résultat devrait être "19 + 3 + 15 + 18 + 5". En d'autres termes, la sortie doit être égale à 60.

S'il vous plaît, essayez de l'expliquer, c'est vraiment difficile pour moi de comprendre cela.

1
Julian Avar 12 juil. 2015 à 23:11

7 réponses

Meilleure réponse

Vous obtenez 1 en sortie à cause de cela Comportement de parseInt:

Si parseInt rencontre un caractère qui n'est pas un chiffre dans le radix spécifié, il l'ignore et tous les caractères suivants et renvoie la valeur entière analysée jusqu'à ce point.

Je pense que vous avez besoin d'utiliser eval et d'utiliser un + avant chaque remplacement:

Remplacez return r_o[matched]; par return "+"+r_o[matched]; et utilisez:

value = parseInt(eval(value), 10);

Ou si vous n'envisagez pas eval, voici une fonction personnalisée:

function sumup(s){
    var total= 0, s= s.match(/\+\d+/g) || [];
    while(s.length){
        total+= parseInt(s.shift());
    }
    return total;
}

Voici votre extrait mis à jour:

// 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>
1
Wiktor Stribiżew 12 juil. 2015 à 20:38

Voici une approche assez simple:

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

Vous voudrez peut-être faire quelques vérifications de limites charVal et quelques vérifications nulles et / ou vérifications de type convert, mais c'est assez simple, je pense.

0
Scott Sauyet 12 juil. 2015 à 20:33

Fondamentalement, la valeur parseInt "voir" est "1 + ..." et analyse 1.

Regardez l'extrait modifié, ouvrez le journal de votre console et voyez ce qui se passe. Profitez-en pour apprendre à déboguer.

// 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);
}
<!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>
0
Amit 12 juil. 2015 à 20:23

Pour autant que je sache, parseInt ne peut pas évaluer les expressions comme vous le faites. Quoi qu'il en soit, je suggère d'utiliser String.prototype.charCodeAt afin de rendre votre code plus lisible et de changer les noms de vos fonctions et variables.

MODIFIER: juste pour clarifier la réponse: ce que vous passez à parseInt est en fait une chaîne qui contient une expression comme "1 + 2 + 3 + 4" ... Ce que parseInt essaie de faire est juste d'analyser le premier entier qu'il obtient, dans ce cas un 1. Comme l'autre vous l'a dit, votre solution semble vraiment compliquée et vous devriez la changer, mais au cas où vous seriez vraiment satisfait de cette solution (vous ne devriez pas), vous pourriez changer:

value = parseInt(value.split("").join(" + "), 10);

Avec:

eval("value = " + value.split("").join(" + ") + ";");

Il y a en fait une autre erreur dans votre code: vous faites un split(""). Cela peut entraîner une erreur lorsque vous remplacez un caractère par un nombre à 2 chiffres, comme 19 (c'est pourquoi même avec ma solution, vous obtiendrez 33 au lieu de 60). Votre RegEx remplace S par 19, mais ensuite, lorsque vous divisez et rejoignez, votre numéro à 2 chiffres est divisé en 1 et 9. Une solution simple pourrait être d'ajouter un espace lors du remplacement, puis de l'utiliser. pour diviser les valeurs, en remplaçant:

return r_o[matched];

Avec

return ' ' + r_o[matched];

Et

eval("value = " + value.split("").join(" + ") + ";");

Avec

eval("value = " + value.split(" ").join(" + ") + ";");

Petite explication: en ce moment, lorsque vous faites votre remplacement, vous remplacez en fait un personnage par <space><number>. Vous utilisez ensuite cet espace pour diviser correctement les valeurs, puis les joindre à l'opérateur +. Enfin, vous évaluez la chaîne "value = 1 + 2 + 3 + 4;.

Cette réponse est uniquement à des fins "éducatives", votre code doit être réécrit

Extrait de travail:

// 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);
}
<!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>
1
Alekos Filini 12 juil. 2015 à 20:44

Ce que tu veux c'est comme ça

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);
1
sanket joshi 12 juil. 2015 à 20:37

J'ai l'impression que vous le compliquez trop. Vous pouvez simplement parcourir chaque caractère de la chaîne à l'aide d'une boucle.

Pour chaque lettre, vérifiez qu'elle existe dans l'objet r_o, et si c'est le cas, récupérez la valeur correspondante de l'objet et ajoutez-la au total.

Voici un exemple

 // 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
1
Carl K 12 juil. 2015 à 20:28

Vous pouvez éviter de stocker le mappage "letter":"number", en tirant parti des valeurs Ascii, convertissez simplement les majuscules et soustrayez 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);
}

Cliquez pour Démo Fiddle

3
Amit.rk3 12 juil. 2015 à 20:36