J'ai donc ceci dans le javascript pour ma page:
var TEST_ERROR = {
'SUCCESS' : 0,
'FAIL' : -1,
'ID_ERROR' : -2
};
Et effectuez des tests sur les fonctions de 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 paragraphe seront 0, -1 ou -2 en fonction du résultat.
Maintenant, je veux mapper cela à une chaîne de sorte que le paragraphe indique 'Success', 'Fail' ou 'ID Error'
Je pourrais le faire de plusieurs manières que j'ai imaginées:
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 énumérés, ou
var TEST_ERROR = {
'SUCCESS' : 0,
'FAIL' : 1,
'ID_ERROR' : 2
};
var TEST_STRING = [
'Success',
'Fail',
'ID Error'
];
Ce qui nécessiterait des changements dans la logique (result > TEST_ERROR.SUCCESS
semble étrange mais!)
Ma question est comment feriez-vous pour mapper une valeur d'énumérateur à une valeur de chaîne en Javascript? Je pense que la deuxième façon est la plus sensée, mais voudrais que l’enquêteur soit positif pour les succès et négatif pour les échecs. J'aime aussi l'idée du premier contenant les chaînes et les valeurs dans la structure de l'objet.
Des idées?
Merci!
Mat
PS. Je vais faire les tests dans un Web Worker, pour que la page ne soit pas bloquée et que les résultats soient placés dans un tableau, pas dans un paragraphe comme ci-dessus.
PPS. Je suis assez nouveau pour la programmation Javascript, mais fais beaucoup en ASM, C, C++, C #. </ I>
Avez-vous réellement besoin des valeurs numériques? Sinon, 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 en outre, cela ne devrait pas poser trop de 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 comme 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 en TypeScript, vous aurez déjà une définition pour l'énum. Sinon, vous pouvez directement utiliser la version JS de l'énum.
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