2012-01-09 4 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]; 

EDIT

うわー、私は私が最初の試行でこれを得たと信じてすることはできません。そこにあるいくつかのバグも、それはあなたのテストケース

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 

希望。

関連する問題