JavaScript Enum À La Valeur De Chaîne Correspondante
J'ai donc ceci dans le javascript pour ma page:
var TEST_ERROR = {
'SUCCESS' : 0,
'FAIL' : -1,
'ID_ERROR' : -2
};
Et effectuer des tests sur les fonctions dans la page comme ceci:
function test()
{
// Get the paragraph from the DOM
var testResultParagraph = document.getElementById('testResult');
// Check the paragraph is valid
if(!testResultBox)
{
// Update the web page
testResultParagraph.value = TEST_ERROR.ID_ERROR;
return TEST_ERROR.ID_ERROR;
}
// Something to store the results
var testResult = TEST_ERROR.SUCCESS;
// Test the calculation
testResult = testCalculate()
// Update the web page
testResultParagraph.value = testResult;
// The test succeeded
return TEST_ERROR.SUCCESS;
}
Le résultat de testCalculate()
et la valeur du point sera soit 0, -1, -2, en fonction du résultat.
Maintenant, je veux mapper ceci à une chaîne de sorte que le paragraphe montre 'Success',' Fail 'ou'id Error'
Je pourrais le faire de plusieurs façons que j'ai pensé:
var TEST_ERROR = {
'SUCCESS' : {VALUE : 0 , STRING: 'Success' },
'FAIL' : {VALUE : -1, STRING: 'Fail' },
'ID_ERROR' : {VALUE : -2, STRING: 'Id Error'},
};
Nécessiterait une modification des accesseurs de points enum, ou
var TEST_ERROR = {
'SUCCESS' : 0,
'FAIL' : 1,
'ID_ERROR' : 2
};
var TEST_STRING = [
'Success',
'Fail',
'ID Error'
];
Ce qui nécessiterait des changements à la logique (result > TEST_ERROR.SUCCESS
semble bizarre!)
Ma question Est de savoir comment allez-vous mapper une valeur d'énumérateur à une valeur de chaîne en Javascript? je pense que la deuxième voie est la plus sensée, mais je voudrais que l'énumérateur soit positif pour les succès et négatif pour les échecs. J'aime aussi l'idée de la première contenant les chaînes et les valeurs dans la structure de l'objet.
Tout des idées?
Merci!
Mat
PS. Je vais faire les tests dans un travailleur Web, de sorte que la page ne se bloque pas et les résultats seront mis dans une table, pas un paragraphe comme ci-dessus.
Spa. Je suis assez nouveau en programmation Javascript, mais je fais beaucoup en ASM, C, C++, C#.
4 réponses
Avez-vous réellement besoin des valeurs numériques? Si ce n'est pas le cas, vous pouvez utiliser quelque chose comme ceci:
var TEST_ERROR = {
SUCCESS : 'Success',
FAIL : 'Fail',
ID_ERROR : 'ID Error'
};
Pas tout à fait optimal, mais le plus propre que vous pouvez obtenir sans pré-calculer le dictionnaire inverse (et d'ailleurs, cela ne devrait pas être trop un problème si vous n'avez que quelques valeurs d'énumération):
function string_of_enum(enum,value)
{
for (var k in enum) if (enum[k] == value) return k;
return null;
}
, Vous pouvez toujours avoir les valeurs des objets d'un type particulier.
var TEST_ERROR = (function() {
function ErrorValue(value, friendly) {
this.value = value;
this.friendly = friendly;
}
ErrorValue.prototype = {
toString: function() { return this.friendly; },
valueOf: function() { return this.value; }
};
return {
'SUCCESS': new ErrorValue(0, 'Success'),
'FAIL': new ErrorValue(1, 'Fail'),
'ID_ERROR': new ErrorValue(2, 'ID error')
};
})();
Maintenant, quand vous obtenez une valeur de ce type:
var err = testFunction(whatever);
, Vous pouvez obtenir la valeur de chaîne avec
alert(err.toString());
, En fait, vous ne devriez même pas avoir à appeler .toString()
explicitement, la plupart du temps.
Si vous êtes typescript, alors vous aurez déjà une définition pour l'énumération. Sinon, vous pouvez directement utiliser la version JS de l'énumération.
var Status;
(function (Status) {
Status[Status["New"] = 0] = "New";
Status[Status["Submitted"] = 1] = "Submitted";
Status[Status["Approved"] = 2] = "Approved";
Status[Status["Rejected"] = 3] = "Rejected";
})(Status || (Status = {}));
var snew = Status.New;
console.log(snew); //This is the number
console.log(Status[snew]); //This is the string