3

動的に構築されたキーパスを介して、ネストされた JSON 辞書にアクセスしたいと考えています。
キーパスは、標準の JSON ドットおよび添え字演算子を使用します。(.[x])
例:

var data = 
{"title": "a_title",
 "testList": [
   {
     "testListItemKey": "listitem1"
   },
   {
     "testListItemKey": "listitem2",
          "deepTestList": [
            {
              "testListItemKey": "listitem1",
                      "testListItemDict":{
                         "subTitle": "sub_title",
                      }
            }]
   }]
}

キーパス文字列の例は次のとおりです。

data.feedEntries[0].testList[2].deepTestList[1].testListItemDict.subTitle  

これまでに見つけた最も簡単な実用的な解決策は、eval または関数コンストラクターを使用することです。

function valueForKeypPath(data, keyPath) {
    "use strict";
    var evaluateKeypath = new Function('data', 'return data.' + keyPath);
    return evaluateKeypath(data);
}

リモート エンドポイントから受け取る JSON データを完全に信頼することはできないため、eval などは避けたいと思います。

4

2 に答える 2

5

"["to".""]"to をすべて置き換えて""

feedEntries.0.testList.2.deepTestList.1.testListItemDict.subTitle

パスを使用するように、これをパス配列に分割します。split('.')

var paths =  ['feedEntries','0','testList','2']

それからちょうど

var root = data;
paths.forEach(function(path) {
   root = root[path];
});

最後に、ルートには目的のデータフラグメントが含まれています。

于 2013-04-28T08:26:15.873 に答える
0

「アンダースコア」を使用している場合は、underscore-keypathをお勧めします

于 2014-02-10T00:44:49.307 に答える