2012-01-25 6 views
35

constantemente me encuentro pasando los valores de configuración de funciones para acceder a ellos de esta manera:Cómo obtener el valor del objeto, con el valor por defecto

var arg1 = 'test1'; 
if(isUndefined(config.args.arg1)){ 
    arg1 = config.args.arg1; 
} 

var arg2 = 'param2'; 
if(isUndefined(config.args.arg2)){ 
    arg2 = config.args.arg2; 
} 

var arg3 = '123'; 
if(isUndefined(config.args.arg3)){ 
    arg3 = config.args.arg3; 
} 

donde más tarde los uso como esto:

var url = '<some-url>?id='+arg1+'&='+arg2 +'=' + arg3; 

¿El jQuery/ExtJS o cualquier otro marco proporciona una solución para acceder a variables como esta de una manera simple, y dar a las variables un valor predeterminado?

Algo así como:

getValueOfObject(config,'args.arg3','<default>'); 

O hay quizá una solución estándar para esto.

NOTA:

Yo también estaba pensando en el patrón común en el que tienen valores por defecto

var defaults = { 
    args: { 
     args1: .... 
    } 
    ... 
} 

y haciendo una combinación de objetos.

Y luego codificando el objeto a una cadena param. Pero como puede ver, los valores del objeto también a veces contienen nombres de parámetros.

Respuesta

9

Parece que finalmente lodash tiene la función _.get() para esto!

43

En general, se puede utilizar el or operator para asignar un valor predeterminado cuando alguna variable se evalúa como Falsy:

var foo = couldBeUndefined || "some default"; 

manera:

var arg1 = config.args.arg1 || "test"; 
var arg2 = config.args.arg2 || "param2"; 

asumiendo que config.args siempre se define, por ejemplo el código ejemplo implica .

+3

Creo que estará bien si 'config.args.arg1' no está definido, pero ¿no fallará si' config' o 'config.args' no está definido? –

+0

No, undefined se evalúa como falso, por lo que la segunda parte de la condición se asigna a 'foo' en dicho escenario. – karim79

+3

@ karim79 él está implicando que 'config.args.arg1' arrojará si' config.args === undefined' – Raynos

2

tratar var options = extend(defaults, userOptions);

esta manera se obtiene todos los UserOptions y caer de nuevo a valores por defecto cuando no pasan ninguna opción.

Nota: utilice cualquier implementación extend que desee.

+0

'extender' generalmente modifica y devuelve su primer argumento. Esto significa que normalmente desea 'extender ({}, valores predeterminados, opciones de usuario)', de modo que no se modifiquen los valores predeterminados. –

+0

https://github.com/Raynos/xtend es inmutable – Raynos

+2

Su versión de extender puede ser inmutable, pero todas las otras versiones que he encontrado incluyen las versiones de jQuery (http://api.jquery.com/ jQuery.extend /), Lodash y guión bajo (http://underscorejs.org/#extend) todos usan la forma no inmutable. –

Cuestiones relacionadas