2011-12-23 3 views
4

잘 모르겠 음.변수가 포함 된 자바 스크립트 도트 표기법

값을 반환하기 위해 개체를 드릴하는 거리를 결정하기 위해 변수를 사용하려고합니다.

var target = "level1.level2.var"; 
var myObject = { 
        level1: { 
         level2: { 
          var: 'value' 
         } 
        } 
       } 
var returnVal = myObject.target; 

어떻게이 작업을 수행 할 수 있습니까? 분명히 이것은 작동하지 않을 것입니다. 다른 방법이 가능합니까?

목표 var를 폭발시킨 다음 각 레벨마다 반복해야한다고 생각했지만, 내가 쉽게 바라 볼 수있는 쉬운 방법이 있는지 확인해달라고 요청했습니다.

+0

'r eturnVal = eval ("myObject."+ target)'? –

+0

@Shiplu : 예, 그렇지만 'eval'을 사용합니다. –

+0

사용자 입력을 전달하지 않았거나 문자열을 안전하지 않은 것으로 확인하는 한. –

답변

9

이 기능을 사용할 수

get_property_from_target(myObject, target); 

더 나은 너무 뭔가 기능의 이름을 바꿀 것입니다.

또한 객체 속성 이름을 var으로 지정하지 마십시오. 자바 스크립트의 키워드이기 때문에 혼란스러워 할 수 있습니다. 그리고 항상 예상대로 작동하거나 일부 오류가 발생할 것이라는 확신이 들지 않습니다. 브라우저.

+0

'if (obj)'를 루프에 추가하여 오류를 던진 것이 아니라 잘못된 대상을 보내면 undefined를 반환합니다. – Paulpro

1

.에 대상을 분할하는 코드를 작성하는 것 외에는 "경로"가 유효한 한 각 토큰에 대해 드릴 다운하지 않아도됩니다.

1

나는 무엇을 할 것인가? (아마도 최고는 아니지만 효과가있을 것입니다.) 당신이 제안한 것입니다. 변수를 분해 한 다음 해당 수준으로 이동하십시오.

function get_property_from_target(obj, target){ 
    var arr = target.split('.'); 
    for(var i = 0; i < arr.length; i++){ 
     if(obj) 
      obj = obj[arr[i]]; 
    } 
    return obj; 
} 

그런 다음 원하는 전화 :

var target = "level1.level2.var"; 
target = target.split('.'); 

var returnVal = myObject; 
for(var i=0,len=target.length; i<len; i++){ 
    returnVal = returnVal[target[i]]; 
} 

console.log(returnVal); // value 
4

Easier? 물론, eval를 사용

정말 심각한 대답이 아니다
var obj = eval('myObject.' + target); 

는하지만. 그런 식으로 좋은 코드에서 eval을 사용하면 안됩니다. 정규 표현식 해킹,

var items = target.split('.'); 
var obj = myObject; 
var i; 

for(i = 0; i < items.length; i++) { 
    obj = obj[items[i]]; 
} 

을 또는 :

var obj = myObject; 
target.replace(/[^\.]+/g, function(m) { 
    obj = obj[m]; 
}); 

에 관계없이, 당신은 지금 obj을 사용할 수있는 유일한 방법은 내가 아는 한, 그러나 당신이 설명하는대로 루프입니다.

내가이 일을 두 가지 방법으로 볼 수 있습니다
+0

'/[^\.]+/ g.exec ('level1.level2.var');'는'[ 'level1']'을 반환합니다. 왜'target.split ('.')'을 사용하지 않는가? –

+1

@Rocket : 네, 한 가지 해결책에 중점을 두었습니다. 나는 이미 편집했지만 다시 읽었습니다. – Ryan

+0

+1, 깔끔한 작은 .replace 트릭입니다. –

2

: eval() 사용

  • (eval로, 눈살을 찌푸리게은 evil입니다) :

    var split = target.split('.'); 
    var newTarget = myObject; 
    
    for (var i = 0; i < split.length; i++) { 
        newTarget = newTarget[split[i]]; 
    } 
    
  • :

    var returnVal = eval('myObject.' + target); 
    
  • 루프를 사용하여

+0

나는'eval'을 사용하지 말 것을 제안 하겠지만, 그것은 하나의 해결책이라고 생각합니다. –

+0

나는 그것이 최적이 아니라고 덧붙일 것이다. – Blender

관련 문제