2012-01-09 17 views
8

किसी ऑब्जेक्ट के किसी दिए गए बच्चे नोड को JSON पथ कैसे मिलेगा?जावास्क्रिप्ट/JSON दिए गए सबनोड के लिए पथ प्राप्त करें?

उदा .:

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

key4 के लिए एक संदर्भ के साथ एक चर दिया जाता है। अब मैं पूर्ण पथ की तलाश में हूं:

data.key1.children.key4 

क्या यह जेएस में ऐसा करने का कोई तरीका है?

अग्रिम धन्यवाद।

+0

यदि आपकी खोज चर एक स्ट्रिंग ऑब्जेक्ट को इंगित करती है (उदाहरण के लिए) तो आप उस पथ के लिए विश्वसनीय रूप से खोज नहीं पाएंगे (उदाहरण के लिए) 'data.key1.children.key3 === data.key4' यह भी सच होगा, और शायद वह नहीं जो आप प्राप्त करने की कोशिश कर रहे हैं। – Yoshi

+0

धन्यवाद योशी, मैंने कोड नमूना अपडेट किया है। अब संदर्भ किसी अन्य वस्तु को इंगित कर रहा है। – 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

हाय एडम, आपके उत्तर के लिए धन्यवाद। मैं पूरा रास्ता ढूंढ रहा हूं। "कुंजी 1" और "बच्चे" अज्ञात हैं। मेरे पास एक चर में संग्रहीत 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 

आशा किसी को मदद मिलेगी।

संबंधित मुद्दे

 संबंधित मुद्दे