2012-01-25 4 views
35

나는 끊임없이이처럼 액세스하는 기능에 대한 설정 값을 통과하는 자신을 찾을 방법 :기본 값으로, 객체에서 값을 얻으려면

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

않습니다

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

어디 나중에 같이 사용할 jQuery/ExtJS 또는 다른 프레임 워크는 이와 같은 변수에 간단한 방법으로 액세스하고 변수에 기본값을 제공하는 솔루션을 제공합니까? 같은

뭔가 :

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

또는 어쩌면 이것에 대한 표준 용액이있다.

참고 :

나는 또한 일반적인 패턴에 대해 생각했다 당신이이 기본값

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

및 오브젝트 병합을하고.

그런 다음 개체를 param String으로 인코딩합니다. 그러나 당신이 볼 수 있듯이 에는 때때로 매개 변수 이름이 포함되어 있습니다. 그래서

var foo = couldBeUndefined || "some default"; 

: 일부 변수가 falsy을 평가할 때

일반적으로

답변

9

가 보이는!

43

, 하나는 기본 할당 할 or operator을 사용할 수 있습니다

귀하의 예제 코드에서 알 수 있듯이 config.args 항상 정의되어 있다고 가정
var arg1 = config.args.arg1 || "test"; 
var arg2 = config.args.arg2 || "param2"; 

.

+3

나는'config.args.arg1'가 정의되지 않은 경우이 확인 될 것입니다 생각하지만, 늘이 config.args'이 정의 자체가''경우 config' 또는 실패? –

+0

아니요, 정의되지 않음은 falsy로 평가되므로이 시나리오에서는 조건의 두 번째 부분이'foo'에 할당됩니다. – karim79

+3

@ karim79 그는'config.args === undefined' 인 경우'config.args.arg1'을 던질 것을 암시합니다. – Raynos

2

var options = extend(defaults, userOptions);

그들이 어떤 옵션을 전달하지 않을 때 당신은 모든 userOptions을 얻고 기본값으로 다시 가을이 방법을 시도해보십시오.

원하는 extend 구현을 사용하십시오. 마지막으로 lodash이에 대한 _.get() 기능이 같은

+0

'extend'는 대개 첫 번째 인수를 수정하고 반환합니다. 이것은 보통'extend ({}, defaults, userOptions)'를 원한다는 것을 의미하므로 기본값은 변경되지 않습니다. –

+0

https://github.com/Raynos/xtend는 변경 불가능합니다 – Raynos

+2

버전의 확장 버전은 변경되지 않을 수도 있지만 jQuery (http://api.jquery.com/) 버전을 비롯하여 다른 모든 버전이 있습니다. jQuery.extend /), Lodash 및 밑줄 (http://underscorejs.org/#extend)은 모두 비 변경 가능 양식을 사용합니다. –

관련 문제