2012-01-25 14 views
35

ja ciągle znajduję się przechodząc wartości konfiguracyjne do funkcji dostępu do nich tak:Jak uzyskać wartość od obiektu o wartości domyślnej

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

gdzie później wykorzystać je tak:

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

robi jQuery/ExtJS lub jakakolwiek inna struktura zapewnia w prosty sposób dostęp do zmiennych w ten sposób i nadaje zmiennym wartość domyślną?

Coś jak:

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

Czy jest tam może standardowe rozwiązanie dla tego.

UWAGA:

Byłem też myśleć o wspólnej strukturze, gdzie trzeba domyślnie

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

i robi scalanie obiektu.

A następnie kodowanie obiektu do łańcucha param. Ale jak widać obiekt wartości również czasami zawierają nazwy parametrów.

Odpowiedz

43

Generalnie, można użyć or operator przypisać domyślnego, gdy niektóre zmienna ma wartość falsy:

var foo = couldBeUndefined || "some default"; 

tak:

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

zakładając, że config.args jest zawsze określone, jak Twój przykład kod implikuje .

+3

Wierzę, że będzie dobrze, jeśli 'config.args.arg1' jest niezdefiniowany, ale nie zrobisz tego, jeśli' config' lub 'config.args' będzie niezdefiniowane? –

+0

Nie, undefined jest oceniany jako falsy, więc druga część warunku zostaje przypisana do 'foo' w takim scenariuszu. – karim79

+3

@ karim79 sugeruje, że 'config.args.arg1' wyrzuci, jeśli' config.args === undefined' – Raynos

2

spróbować var options = extend(defaults, userOptions);

ten sposób można uzyskać wszystkie userOptions i spaść z powrotem do ustawień, gdy nie przechodzą żadnych opcji.

Uwaga użyj dowolnej implementacji extend.

+0

'extend' zwykle modyfikuje i zwraca jego pierwszy argument. Oznacza to, że zwykle potrzebujesz 'extend ({}, defaults, userOptions), aby ustawienia domyślne nie zostały zmienione. –

+0

https://github.com/Raynos/xtend jest niezmienny – Raynos

+2

Twoja wersja rozszerzenia może być niezmienna, ale wszystkie inne wersje, na które natrafiłem włączając wersje z jQuery (http://api.jquery.com/ jQuery.extend /), Lodash i podkreślenie (http://underscorejs.org/#extend) - wszystkie używają niezmiennej postaci. –

Powiązane problemy