2011-10-13 13 views
22

Ho bisogno di un po 'di aiuto per la sintassi con un operatore ternario che mi aiuterà a mettere le icone degli indicatori corretti sulla mia buona mappa. Ho tre aree 0,1 e 2 che hanno icone uniche 0, 1 e 2.Operatori ternari multipli

Avevo solo due aree, quindi questo operatore ternario funzionava correttamente;

icon: (area == 1) ? icon1: icon0, 

Ora ho bisogno di aggiungere un'ulteriore terza icona (icona2) per area2.

Ho provato vari metodi ma non riesco a farlo bene.

risposta

36

La sintassi sarebbe:

icon: (area == 1) ? icon1 : (area == 2) ? icon2 : icon0, 

Ma questo sta cominciando a complicarsi. Si può ben essere meglio creare solo una funzione per fare questo lavoro, invece:

icon: getIcon(area), 

... 

function getIcon(area) { 
    if (area == 1) { 
    return icon1; 
    } else if (area == 2) { 
    return icon2; 
    } 

    return icon0; 
} 
+0

Dopo averlo scritto, mi sono reso conto che 0 esegue sempre il mapping a icon0, quindi la risposta di Pointy è preferibile. Tuttavia, questo approccio è ancora fattibile se hai bisogno di un valore 'catch-all' come 'icon0' in questo caso. –

+0

Grazie Justin, ho deciso la funzione più adatta alle mie esigenze. Trovo anche più amichevole lavorare con un operatore piuttosto che ternario che potrebbe diventare ancora più grande nel tempo. Grazie. – Sam

+0

Nessun problema, felice che tu abbia trovato utile questo! –

2
icon: (area == 0) ? icon0 : (area == 1) ? icon1 : icon2, 
17

ne dite:

icon: [ icon0, icon1, icon2 ][area], 
+1

+1 - Finché zona 0 mappe sempre ad icona 0, questo è il metodo più conciso ... –

+0

Sì che è un buon punto - che si basa su "area" si sta comportando bene, per così dire. – Pointy

+0

Mi piace questo metodo, ma ho contrassegnato Justin come la risposta più adatta alle esigenze. Mille grazie per questo suggerimento. – Sam

7

Che ne dite di un oggetto letterale.

icons = { 
    0: icon0, 
    1: icon1, 
    2: icon2 
} 

icon = icons[area]; 
4

Molto semplice modo

var test1 = false 
var test2 = true 
var test = test1 ? test1 : test2 ? test2 : 'some default value' 
+0

questo non è un test molto buono, come 'test1? test1: (test2? test2: 'qualche valore predefinito') 'e' (test1? test1: test2)? test2: 'some default value'' entrambi danno lo stesso risultato – chharvey

+0

un test migliore sarebbe: 'var test = true; var result = test === true? 'è vero': test === falso? 'è falso': 'è nulla'. In questo modo quando raggruppate gli ultimi due operatori, 'test === true? 'è vero': (test === false? 'è falso': 'è null') ', si ottiene' 'è vero'' (corretto), ma quando si raggruppano i primi due operatori, ' (test === vero? 'è vero': test === false)? 'è falso': 'è nulla', ottieni '' è falso '' (errato). Questo test è migliore perché mostra i raggruppamenti impliciti dell'operatore. – chharvey