2013-08-09 13 views
5

Io uso questo metodo per creare Enums in JavaScript? enumerazioni nel nostro codice ..Conversione enumerazioni a matrice di valori (Mettendo tutti i valori in un array JSON)

Così

var types = { 
    "WHITE" : 0, 
    "BLACK" : 1 
} 

Ora il problema è quando voglio creare convalide ovunque, devo farlo;

model.validate("typesColumn", [ types.WHITE, types.BLACK ]); 

Ora c'è un modo posso solo semplice convertire i valori in tipi a una matrice in modo che io non devo elencare tutti i valori della enum?

model.validate("typesColumn", types.ValuesInArray]); 

EDIT: Ho creato una libreria molto semplice enum per generare enumerazioni semplici npm --save-dev install simple-enum (https://www.npmjs.com/package/simple-enum)

risposta

6

avrei convertire la mappa in una matrice e memorizzarla come types.all. È possibile creare un metodo che lo fa automaticamente:

function makeEnum(enumObject){ 
    var all = []; 
    for(var key in enumObject){ 
     all.push(enumObject[key]); 
    } 
    enumObject.all = all; 
} 
+0

Penso che questa sia la soluzione più bella .. Posso chiamare makeEnum quando dichiaro enum quindi è solo possibile chiamare .all –

+0

Fa anche ciò che è richiesto ? Sicuramente dopo questo 'all' sarebbe e matrice di nomi di proprietà?come '['WHITE', 'BLACK']' piuttosto che una serie di valori (che l'OP ha richiesto). Inoltre, 'enum' è una parola riservata! Perché è stato accettato? ... – musefan

+0

Immagino che l'OP abbia preso l'idea senza esaminare l'esatta implementazione che è davvero scorretta. Lo correggerò per altri utenti, grazie per il commento. – Yann

2

Si potrebbe convertirlo in un array, oppure si può semplicemente scorrere le proprietà dell'oggetto (che è come si potrebbe creare l'array in ogni caso):

for(var i in types){ 
    var type = types[i]; 
    //in the first iteration: i = "WHITE", type = 0 
    //in the second iteration: i = "BLACK", type = 1 
} 

Solo per completezza, è possibile creare l'array con quel metodo come segue:

var arr = []; 
for(var i in types){ 
    var type = types[i]; 
    arr.push(type); 
} 
//arr = [0, 1] 

per rendere questo riutilizzabili si potrebbe creare una funzione di supporto:

function ObjectToValueArray(obj){ 
    var arr = []; 
    for(var i in obj){ 
     var v = obj[i]; 
     arr.push(v); 
    } 
    return arr; 
} 

che può essere chiamato in questo modo:

model.validate("typesColumn", ObjectToValueArray(types)); 
+0

So che posso convertire questi, ma dal momento che questi sono utilizzati in vari punti, sto cercando una soluzione a una linea. Qualcosa di molto semplice che supporta questa funzionalità –

+1

Creare una funzione di supporto e riutilizzarla quella – musefan

5
var types = { 
    "WHITE" : 0, 
    "BLACK" : 1 
} 
var typeArray = Object.keys(types).map(function(type) { 
    return types[type]; 
}); 
//typeArray [0,1] 

model.validate("typesColumn", typeArray); 

jsFiddle Demo

+1

+1 per 'Object.keys'. Codice JavaScript moderno per ambienti moderni come node.js! –

+0

+1, ma preferisco rifattare 'chiavi' +' map' in una funzione generale 'values ​​(obj)' e quindi semplicemente 'validate (" typesColumn ", values ​​(types))'. – georg

1

Juice (o avvolgere) .validate tale che accetterà types nel senso tutti i membri?

soluzione
var types = { 
    "WHITE" : 0, 
    "BLACK" : 1, 
    "RED" : 200 
} 

validate("foo", types.WHITE); // 0 
validate("foo", [types.WHITE, types.BLACK]); // 0,1 
validate("foo", types); // 0,1,200 

function validate(foo, values) { 
    var arr = []; 
    switch (typeof values) { 
     case "number": 
      arr.push(values); 
      break; 
     case "object": 
      if (values instanceof Array) 
       arr = values; 
      else { 
       for (var k in values) 
        arr.push(values[k]); 
      } 
      break; 
    } 
    alert(arr); 
} 
5

semplice (ES6)

È possibile utilizzare Object.values come questo:

var valueArray = Object.values(types); 

Online demo (fiddle)

Problemi correlati