2013-01-17 2 views
0

약간의 문제로 어려움을 겪고 있습니다. 의 내가 객체를 가지고 있다고 가정 해 봅시다 : 오브젝트의 도트 표기법을 사용하여 오브젝트의 값을 검색하십시오.

var foo = { 
    bar: { 
     baz: true 
    } 
}; 

지금 나는 또한 문자열 'foo.bar.baz' 있습니다. 이제 문자열을 사용하여 객체에서 값을 검색하고 싶습니다.

참고 : 이것은 단지 예일뿐 해결책은 동적이어야합니다.

는 업데이트 :

는 또한 동적 문자열에서 구문 분석 할 변수 이름이 필요합니다. 또한 내 변수가 윈도우의 속성인지 확신 할 수 없습니다.

는 이미 eval를 사용하여 솔루션을 구축,하지만 내 생각은 아주 못생긴 : 나는 문자열을 사용 생각할 수있는 어떤 http://jsfiddle.net/vvzyX/

답변

2

는이 작업을 수행 할 수있는 방법입니다 루프와 객체의 속성에 액세스 할 수 e (점으로 구분 된 값)이고 두 번째 값은 parent 개체이며 부모가 제공되지 않으면 window이 사용됩니다. 부모 인수를 사용

하나 더 예 : 여기

var str = 'foo.bar.baz'; 
    foo = { 
     bar: { 
      baz: true 
     } 
    }; 

result = getValue(str, foo); 
console.log(result); 

jsfiddle의 예입니다.

비슷한 접근 방식이 YUI에서 사용됩니다. 그들의 접근 방식을 Namespace 패턴이라고합니다. 주요 이점은 패키지/네임 스페이스의 시뮬레이션입니다. 이 스크립트와 네임 스페이스 패턴의 유일한 차이점은 네임 스페이스 함수가 ​​값을 반환하는 대신 중첩 구조를 만드는 것입니다. 예를 들어

+0

내 업데이 트를 참조하십시오. –

+0

내 업데이트보기 :-) –

+1

감사합니다. 누락 된 부분이었습니다. 변수는 상위 범위 또는 전역 범위에만있을 수 있습니다. –

0

먼저 배열로 해당 문자열을 분할하고,를 통해 개체에 액세스 분할

function getValue(namespace, parent) { 
    var parts = namespace.split('.'), 
     current = parent || window; 
    for (var i = 0; i < parts.length; i += 1) { 
     if (current[parts[i]]) { 
      current = current[parts[i]]; 
     } else { 
      if (i >= parts.length - 1) 
      return undefined; 
     } 
    } 
    return current; 
} 
var foo = { 
    bar: { 
     baz: true 
    } 
}; 
console.log(getValue('foo.bar.baz')); //true 

함수의 첫 번째 인수는 namespac입니다 : []

여기
4

,

function get(obj, path) { 
    return path.split('.').reduce(function(obj, p) { 
     return obj[p] 
    }, obj); 
} 

데모 :

tree = { 
    foo: { 
     bar: 1, 
     baz: { quux: 3 }, 
    }, 
    spam: 1 
} 

console.log(get(tree, 'foo.baz.quux')) // 3 
+0

내 업데이트를 참조하십시오. –

+0

@JulianHollmann :'eval' 만이 유일한 길입니다. – georg

+0

@ thg435 : Lol no! 내 대답을 보라. – Amberlamps

2

이 시도 :

var name = [window].concat('foo.bar.baz'.split('.')).reduce(function(prev, curr) { 
    return prev[curr]; 
}); 

console.log(name); 

// -> 'true' 
+0

재미 있지만 제대로 작동하지 않습니다. 어떻게 든 prev [curr]는 허용되지 않습니다. http : // jsfiddle.net/VXeaa/ – primavera133

+0

조금 사악한 eval로 작업해야합니다. http://jsfiddle.net/VXeaa/1/ – primavera133

+0

원본 코드를 사용하고 있지 않습니다. 너는'[window] .concat ([...]을 놓쳤다.])'코드 예제에서. – Amberlamps

관련 문제