web-dev-qa-db-fra.com

Javascript Enum To 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 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>

24
Matt Clarkson

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'
};
21
LukeH

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;
}
21
Victor Nicollet

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.

3
Pointy

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
0
Pratik Bhattacharya