2012-01-09 2 views
8

개체의 지정된 하위 노드로 JSON 경로를 가져 오는 방법은 무엇입니까?Javascript/JSON에서 주어진 하위 노드의 경로를 가져 옵니까?

예컨대 :

var data = { 
    key1: { 
     children: { 
      key2:'value', 
      key3:'value', 
      key4: { ... } 
     }, 
    key5: 'value' 
} 

KEY4 참조 가진 변수가 주어진다. 이제 절대 경로를 찾고 있는데요.

data.key1.children.key4 

JS에서이 작업을 수행 할 수있는 방법이 있습니까?

미리 감사드립니다.

+0

검색 변수가 문자열 개체를 가리키는 경우 (예에서와 같이) 'data.key1.children.key3 === data.key4'처럼 해당 경로를 안정적으로 검색 할 수 없습니다. 또한 '사실'일 것이고, 아마도 당신이 성취하고자하는 것이 아닙니다. – Yoshi

+0

감사합니다. Yoshi, 코드 샘플을 업데이트했습니다. 이제 참조가 다른 객체를 가리키고 있습니다. – user1138959

답변

8

값이 "key3"인 변수가 있고이 문자열의 값을 기준으로이 속성에 동적으로 액세스하는 방법을 알고 싶습니까?

var str = "key3"; 
data["key1"]["children"][str]; 

편집

와우, 나는 첫 번째 시도에있어 믿을 수 없다. 거기에 몇 가지 버그 수 있지만, 테스트 케이스

LIVE DEMO

var x = data.key1.children.key4; 

var path = "data"; 
function search(path, obj, target) { 
    for (var k in obj) { 
     if (obj.hasOwnProperty(k)) 
      if (obj[k] === target) 
       return path + "['" + k + "']" 
      else if (typeof obj[k] === "object") { 
       var result = search(path + "['" + k + "']", obj[k], target); 
       if (result) 
        return result; 
      } 
    } 
    return false; 
} 

var path = search(path, data, x); 
console.log(path); //data['key1']['children']['key4'] 
+0

안녕하세요, 아담, 답장을 보내 주셔서 감사합니다. 나는 완전한 길을 찾고있다. "key1"과 "children"은 알 수 없습니다. 변수에 저장된 data.key1.children.key3에 대한 참조를 가지며 거기에 도착하는 방법을 알아야합니다. – user1138959

+0

@ user1138959 - 그럴 가능성은 확실하지 않습니다. 즉, 객체의 모든 멤버를 통해 반복적 인 검색을 수행 할 수는 있지만 동일한 값을 사용해야하는 경우 변수가 가리키는 멤버를 알 수있는 방법이 없습니다. –

+0

코드 예제를 업데이트했습니다. 문자열 값이 아닌 객체를 찾고 있습니다. 재귀 적으로 모든 회원을 검색하고 일치하는 자녀의 경로를 얻는 방법은 무엇입니까? – user1138959

4

이 내가이 작업을 수행 한 방법입니다 작동 할 수 있습니다. 테스트를 위해

/** 
* Converts a string path to a value that is existing in a json object. 
* 
* @param {Object} jsonData Json data to use for searching the value. 
* @param {Object} path the path to use to find the value. 
* @returns {valueOfThePath|undefined} 
*/ 
function jsonPathToValue(jsonData, path) { 
    if (!(jsonData instanceof Object) || typeof (path) === "undefined") { 
     throw "Not valid argument:jsonData:" + jsonData + ", path:" + path; 
    } 
    path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties 
    path = path.replace(/^\./, ''); // strip a leading dot 
    var pathArray = path.split('.'); 
    for (var i = 0, n = pathArray.length; i < n; ++i) { 
     var key = pathArray[i]; 
     if (key in jsonData) { 
      if (jsonData[key] !== null) { 
       jsonData = jsonData[key]; 
      } else { 
       return null; 
      } 
     } else { 
      return key; 
     } 
    } 
    return jsonData; 
} 

, 사람을 도움이 될 것입니다

var obj = {d1:{d2:"a",d3:{d4:"b",d5:{d6:"c"}}}}; 
jsonPathToValue(obj, "d1.d2"); // a 
jsonPathToValue(obj, "d1.d3"); // {d4: "b", d5: Object} 
jsonPathToValue(obj, "d1.d3.d4"); // b 
jsonPathToValue(obj, "d1.d3.d5"); // {d6: "c"} 
jsonPathToValue(obj, "d1.d3.d5.d6"); // c 

희망.

관련 문제