2010-11-26 22 views
20

J'ai donc cela dans le javascript pour ma page:Javascript ENUM correspondant Valeur chaîne

var TEST_ERROR = { 
     'SUCCESS' : 0, 
     'FAIL'  : -1, 
     'ID_ERROR' : -2 
     }; 

et effectuent 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 paragraphe sera soit 0, -1, -2 en fonction du résultat.

Maintenant, je veux mapper ce à une chaîne de sorte que les de succès »montre paragraphe, « échec » ou « Erreur ID »

je pouvais le faire de plusieurs façons je figurés:

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 de ENUM, ou

var TEST_ERROR = { 
     'SUCCESS' : 0, 
     'FAIL'  : 1, 
     'ID_ERROR' : 2 
     }; 

var TEST_STRING = [ 
     'Success', 
     'Fail', 
     'ID Error' 
     ]; 

qui nécessiterait des modifications à la logique (result > TEST_ERROR.SUCCESS semble étrange tho!)

Ma question est comment allez-vous mapper une valeur d'énumérateur à une valeur de chaîne dans Javascript? Je pense que la deuxième façon est la plus raisonnable, mais j'aimerais 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.

Des idées?

Merci!

Matt

PS. Je vais faire le test dans un Web Worker, afin que la page ne se bloque pas et les résultats seront mis dans une table, pas un paragraphe comme ci-dessus.

PPS. Je suis assez nouveau pour la programmation Javascript, mais je fais beaucoup en ASM, C, C++, C#.

+0

Merci pour les réponses, je suis assez tôt dans ce projet donc j'accepte une réponse mais je ne sais pas dans quelle direction j'irai en ce moment. –

Répondre

17

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' 
}; 
+0

J'aime ça, c'est gentil et simple. Je pourrais juste faire 'si (résultat! = TEST_ERROR.SUCCESS)' et utiliser votre réponse. Laissez-moi réfléchir pour voir si je vais avoir besoin d'autres états de passage autres que TEST_ERROR.SUCCESS. –

17

Pas tout à fait optimale, mais le plus propre que vous pouvez obtenir sans pré-calcul du dictionnaire inverse (et d'ailleurs, cela ne devrait pas être trop d'un problème si vous avez seulement quelques valeurs d'énumération):

function string_of_enum(enum,value) 
{ 
    for (var k in enum) if (enum[k] == value) return k; 
    return null; 
} 
+1

Fonctionne bien! Cela devrait être la réponse acceptée, fonctionne pour toute énumération, aucune limitation. – Alex

+0

Très bien. Je pense que ** return enum [value]; ** fonctionnera aussi. – jramos

3

Vous pouvez toujours avoir des valeurs d'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 devriez même pas appeler .toString() explicitement , la plupart du temps.

+0

Bon, semble logique construire dans un '.toString()' pour l'objet énumérateur. Je commence juste avec ceci donc je devrais avoir une pensée si j'ai besoin de ceci au-dessus de la solution de LukeH. –