2010-11-26 17 views
20

así que tengo esto en el Javascript para mi página:Javascript Enum Para Correspondiente Valor de cadena

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

y realizar pruebas sobre las funciones de la página, así:

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; 
} 

El resultado de testCalculate() y el valor del párrafo será 0, -1, -2 dependiendo del resultado.

Ahora desea asignar a un cadena para que el 'éxito' del párrafo espectáculos, 'Fallo' o 'Error ID'

que podía hacer esto algunas maneras he intervenido:

var TEST_ERROR = { 
     'SUCCESS' : {VALUE : 0 , STRING: 'Success' }, 
     'FAIL'  : {VALUE : -1, STRING: 'Fail' }, 
     'ID_ERROR' : {VALUE : -2, STRING: 'Id Error'}, 
     }; 

requeriría una modificación de los métodos de acceso de punto de enumeración, o

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

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

lo que requeriría cambios en la lógica (result > TEST_ERROR.SUCCESS parece extraño aunque!)

Mi pregunta es ¿cómo harías para mapear un valor de enumerador a un valor de cadena en Javascript? Estoy pensando que la segunda forma es la más sensata, pero me gustaría que el enumerador sea positivo para los éxitos y negativo para los errores. También me gusta la idea de la primera que contiene las cadenas y los valores en la estructura del objeto.

¿Alguna idea?

Gracias!

Matt

PS. Voy a hacer las pruebas en un Trabajador web, para que la página no cuelgue y los resultados se incluirán en una tabla, no en un párrafo como el anterior.

PPS. Soy bastante nuevo en la programación de Javascript, pero hago mucho en ASM, C, C++, C#.

+0

Gracias por las respuestas, estoy bastante adelantado en este proyecto, así que aceptaré una respuesta, pero no estoy seguro de qué dirección tomaré en este momento. –

Respuesta

17

¿Realmente necesita los valores numéricos? De lo contrario, podría usar algo como esto:

var TEST_ERROR = { 
    SUCCESS : 'Success', 
    FAIL  : 'Fail', 
    ID_ERROR : 'ID Error' 
}; 
+0

Me gusta esto, es agradable y simple. Podría simplemente hacer 'if (result! = TEST_ERROR.SUCCESS)' y usar su respuesta. Déjame pensar para ver si necesitaré algún otro estado de pase distinto a TEST_ERROR.SUCCESS. –

17

No del todo óptimo, pero el más limpio que puede obtener sin pre-calcular el diccionario inverso (y además, esto no debería ser demasiado de un problema si sólo tiene unos valores de enumeración):

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

¡Funciona muy bien! Esta debería ser la respuesta aceptada, funciona para cualquier enumeración, sin limitaciones. – Alex

+0

Muy bien. Creo que ** return enum [value]; ** también funcionará. – jramos

3

Siempre puede tener los valores como objetos de un tipo particular.

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') 
    }; 
})(); 

Ahora, cuando se obtiene un valor de ese tipo:

var err = testFunction(whatever); 

que pueda obtener el valor de cadena con

alert(err.toString()); 

De hecho ni siquiera debería tener que llamar explícitamente .toString() la mayor parte del tiempo

+0

Bueno, parece sensato construir en '.toString()' para el objeto enumerador. Estoy empezando con esto, así que tendré que pensar si necesito esto sobre la solución LukeH. –

Cuestiones relacionadas