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#.

22
demandé sur Matt Clarkson 2010-11-26 19:16:07

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'
};
18
répondu LukeH 2010-11-26 16:21:57

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;
}
20
répondu Victor Nicollet 2010-11-26 16:19:40

, 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.

3
répondu Pointy 2010-11-26 16:24:29

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
0
répondu Pratik Bhattacharya 2018-07-11 18:06:53