2011-10-13 16 views
22

Necesito un poco de ayuda sintáctica con un operador ternario que me ayudará a poner los iconos de marcador correctos en mi mapa bueno. Tengo tres áreas 0,1 y 2 que tienen iconos únicos 0, 1 y 2.Operadores ternarios múltiples

Solía ​​tener solo dos áreas, por lo que este operador ternario funcionaba bien;

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

Ahora necesito agregar un tercer icono adicional (icon2) para area2.

He intentado varios métodos pero parece que no puedo hacerlo bien.

Respuesta

36

La sintaxis sería:

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

Pero esto está empezando a complicarse. Que bien puede ser mejor simplemente crear una función para hacer este trabajo en su lugar:

icon: getIcon(area), 

... 

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

    return icon0; 
} 
+0

Después de escribir esto, me di cuenta de que 0 siempre se asigna a icon0, por lo que la respuesta de Pointy es preferible. Sin embargo, este enfoque aún es viable si necesita un valor 'catch-all' como 'icon0' en este caso. –

+0

Gracias Justin, decidí que la función se ajustaba mejor a mis necesidades. También me resulta más amigable trabajar con un operador ternario que con el tiempo puede crecer aún más. Gracias. – Sam

+0

¡No hay problema, me alegro de que hayas encontrado útil! –

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

¿Qué tal:

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

+1 - Mientras zona 0 asignen siempre al icono 0, este es el método más concisa ... –

+0

Sí que es un buen punto - que se basa en "área" siendo de buen comportamiento, por así decirlo. – Pointy

+0

Me gusta este método pero marqué a Justin como la respuesta que mejor se ajusta a las necesidades. Muchas gracias por este consejo. – Sam

7

¿Qué tal un objeto literal.

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

icon = icons[area]; 
4

muy sencilla manera

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

esta no es una muy buena prueba, como 'test1? test1: (test2? test2: 'algún valor predeterminado') 'y' (test1? test1: test2)? test2: 'algún valor predeterminado' 'ambos dan el mismo resultado – chharvey

+0

una mejor prueba sería: 'var test = true; var result = test === true? 'es verdad': prueba === ¿falso? 'es falso': 'es nulo'. De esa forma, cuando agrupe a los dos últimos operadores, 'test === true? 'es verdadero': (prueba === falso? 'es falso': 'es nulo') ', obtienes''es cierto'' (correcto), pero cuando agrupas los dos primeros operadores, ' (prueba === verdadero? 'es verdadero': prueba === falso)? 'es falso': 'es nulo' ', obtienes ''es falso' '(incorrecto). Esta prueba es mejor porque muestra los grupos de operadores implícitos. – chharvey