2012-01-25 17 views
35

ho sempre trovo il passaggio di valori di configurazione per le funzioni loro accesso in questo modo:Come ottenere il valore da Object, con valore di default

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

dove ho poi li uso come questo:

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

fa jQuery/ExtJS o qualsiasi altro framework forniscono una soluzione per accedere a variabili come questa in un modo semplice e dare alle variabili un valore predefinito?

Qualcosa di simile:

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

O c'è forse una soluzione standard per questo.

NOTA:

stavo anche pensando al modello comune in cui si hanno valori di default

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

e fare un merge oggetto.

E quindi codificare l'oggetto in una stringa param. Ma come puoi vedere l'oggetto i valori contengono talvolta anche nomi di parametri.

risposta

9

Sembra che finalmente lodash ha la funzione _.get() per questo!

43

Generalmente, si può usare il or operator per assegnare un predefinito quando qualche variabile restituisce falsy:

var foo = couldBeUndefined || "some default"; 

così:

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

supponendo che config.args è sempre definita, come implica il suo codice esempio .

+3

Credo che sarà ok se 'config.args.arg1' è indefinito, ma non fallisce se' config' o 'config.args' è esso stesso indefinito? –

+0

No, il valore non definito è falsificato, quindi la seconda parte della condizione viene assegnata a "pippo" in tale scenario. – karim79

+3

@ karim79 sta implicando 'config.args.arg1' genererà se' config.args === undefined' – Raynos

2

provare var options = extend(defaults, userOptions);

In questo modo si ottengono tutti i UserOptions e cadere di nuovo ai difetti quando non passano tutte le opzioni.

Nota utilizzare qualsiasi implementazione extend desiderata.

+0

'extend' di solito modifica e restituisce il primo argomento. Questo significa che di solito vuoi 'extend ({}, default, userOptions)', in modo che i valori di default non vengano modificati. –

+0

https://github.com/Raynos/xtend è immutabile – Raynos

+2

La tua versione di estensione potrebbe essere immutabile, ma tutte le altre versioni che ho trovato tra cui le versioni di jQuery (http://api.jquery.com/ jQuery.extend /), Lodash e underscore (http://underscorejs.org/#extend) utilizzano tutti la forma non immutabile. –

Problemi correlati