2012-06-11 1 views
2

다음 JavaScript 데이터 구조를 가지고 있습니다. a[]은 텍스트 문자열을 요소로 갖는 배열입니다. 미리 포함되어있는 것은 이 아닙니다. 예를 들어, 사전에 구조를 알지 못하고 JSON에서 키 값을 찾습니다.

a = ["foo", "bar", "baz"...]; 

res{}

요소는 많은 키와 JSON 객체는 "A"는 다음 규칙; 마지막 가장 안쪽의 키 res{}은 또는 이라고하는 배열 의 개체입니다. 가장 안쪽의 키 자체는 배열입니다. 내가 말했듯이 그래서, 경우, 다음 resa[]가 또는 어떤 요소의 값이 얼마나 오래 사전에 알고있다, 하나

// if 
a = ["foo", "bar"]; 

// then 
res = { 
    "foo": { 
     "bar": { 
      "features": [] 
     } 
    } 
}; 

// and I want 
data = res["foo"]["bar"].features; 

// or 
res = { 
    "foo": { 
     "bar": [] 
    } 
}; 

// and I want 
data = res["foo"]["bar"]; 

입니다. 위의 작업을 수행하려면 어떻게해야합니까?

업데이트

: 나는 다음과 같은 재귀 솔루션은 목적을 달성 생각 res

+0

'res = { "foo": "bar": ...'잘못된 JSON입니다. 또한 JSON 객체에는 "마지막"키가 없습니다. 키 순서는 보장되지 않습니다 (실제로 JSON 객체는 명시 적으로 정렬되지 않습니다). – Flambino

+0

이 오타를 수정하고 "마지막"을 "가장 안쪽"으로 변경했습니다. – punkish

답변

2

이 작동 확인 당신의 사본을 호출 할 수 있습니다

function getFeatures(obj, keys) { 
    if(keys.length) { 
    key = keys.shift(); 
    obj = obj[key]; 
    return getFeatures(obj, keys); 
    } else { 
    return obj.features || obj; 
    } 
} 

키 배열은 전달 된 배열의 원소를 꺼내는 함수입니다. 나는.

var keys = ["foo", "bar"]; 

var res1 = { "foo": { "bar": { "features": [1, 2, 3] } } }; 
getFeatures(res1, keys.slice(0)); // => [1, 2, 3] 

var res2 = { "foo": { "bar": ["a", "b", "c"] } }; 
getFeatures(res2, keys.slice(0)); // => ["a", "b", "c"] 
+0

솔루션을 제공해 주셔서 감사합니다. 무엇보다도 JS 프로그래밍에 대한 좋은 교훈. – punkish

0

의 구조에 오타가 수정되었습니다. 기능을 초기 설정으로

function doSomething(i) { 
    if (i==a.length) 
     return []; // can be made {features:[]} 
    var d = {} 
    d[a[i]] = doSomething(i+1); 
    return d; 
} 

doSomething(0); 

대체 반복 솔루션 :

var a = ['foo', 'bar']; 

var i = a.length -1; 
var res,d={features:[]}; 

while(i >=0) { 
    res ={}; 
    res[a[i]]=d; 
    d=res; 
    i--; 
} 

--v

관련 문제