2012-01-09 16 views
8

Come si ottiene un percorso JSON su un determinato nodo figlio di un oggetto?Javascript/JSON ottengono il percorso per un nodo secondario?

Es .:

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

Una variabile con un riferimento key4 è dato. Ora sto cercando il percorso assoluto:

data.key1.children.key4 

C'è un modo per ottenere questo fatto in JS?

Grazie in anticipo.

+0

Se la variabile di ricerca punta a un oggetto stringa (come nell'esempio) non sarà possibile effettuare una ricerca affidabile di tale percorso come (ad esempio) 'data.key1.children.key3 === data.key4' sarebbe anche 'true', e probabilmente non è quello che stai cercando di ottenere. – Yoshi

+0

Grazie a Yoshi, ho aggiornato il codice di esempio. Ora il riferimento punta a un altro oggetto. – user1138959

risposta

8

Quindi si dispone di una variabile con il valore "key3" e si desidera sapere come accedere dinamicamente a questa proprietà, in base al valore di questa stringa?

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

EDIT

Wow, non posso credere che ho ottenuto questo al primo tentativo. Ci potrebbe essere qualche bug in esso, ma funziona per il vostro caso di test

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

Ciao Adam, grazie per la tua risposta. Sto cercando il percorso completo. "key1" e "children" sono sconosciuti. Ho un riferimento a data.key1.children.key3 memorizzato in una variabile e ho bisogno di sapere come arrivarci. – user1138959

+0

@ user1138959 - Non sono sicuro che sia possibile. Voglio dire, potresti fare una ricerca ricorsiva attraverso ogni membro del tuo oggetto, ma non ci sarebbe ancora modo di sapere a quale membro la tua variabile ha puntato se tu avessi valori uguali –

+0

Ho aggiornato il mio esempio di codice. Sto cercando un oggetto, non un valore stringa. Come faccio a cercare ricorsivamente attraverso ogni membro e ottenere il percorso per il bambino corrispondente? – user1138959

4

Questo è il modo in cui ho fatto questo.

/** 
* 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; 
} 

Per il test,

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 

speranza che aiuterà qualcuno.

Problemi correlati