0

JSON入力があります

{
    "Categories": {
        "Facets": [{
            "count": 1,
            "entity": "Company",
            "Company": [{

                "entity": "Ford Motor Co",

                "Ford_Motor_Co": [{
                    "count": 1,
                    "entity": "Ford"
                }]
            }]
        }, {
            "count": 4,
            "entity": "Country",
            "Country": [{

                "entity": "Germany",
                "Germany": [{
                    "count": 1,
                    "entity": "Germany"
                }],
                "currency": "Euro (EUR)"
            }, {

                "entity": "Italy",
                "Italy": [{
                    "count": 1,
                    "entity": "Italy"
                }],
                "currency": "Euro (EUR)"
            }, {

                "entity": "Japan",
                "Japan": [{
                    "count": 1,
                    "entity": "Japan"
                }],
                "currency": "Yen (JPY)"
            }, {

                "entity": "South Korea",
                "South_Korea": [{
                    "count": 1,
                    "entity": "South Korea"
                }],
                "currency": "Won (KRW)"
            }]
        }, {
            "count": 5,
            "entity": "Persons",
            "Persons": [{
                "count": 2,
                "entity": "Dodge"
            }, {
                "count": 1,
                "entity": "Dodge Avenger"
            }, {
                "count": 1,
                "entity": "Major League"
            }, {
                "count": 1,
                "entity": "Sterling Heights"
            }]
        }]

    }
}

各レベルのエンティティの値を配列に取得する必要があります..

[Company, Ford Motor Co, Ford, ....... , Sterling Heights]

コードを使用して最初のレベルを通過できます

for (var k in h.Categories.Facets)
{

alert(h.Categories.Facets[k].entity);

}

エンティティの値を取得するために内部レベルに到達するにはどうすればよいですか??

4

4 に答える 4

1

各エンティティに対して foreach を実行する必要があります。レベル数がわかっている場合は、ループをネストできます。そうでない場合は、おそらく再帰関数を使用する必要があります。

編集

再帰関数:

function getEntities(ent)
{
   alert(ent);
   for (var l in ent)
   {
      getEntities(ent[l].entity);
   }
}

次に使用します。

for (var k in h.Categories.Facets)
{
   getEntities(h.Categories.Facets[k]);
}

幸運を!

于 2012-05-03T20:49:33.527 に答える
1

最も一般的な再帰的な答え:

function getEntities(any) {
    var entities = [];
    if ('entity' in any​) {
        entities.push(any.entity);
    }
    for (var prop in any) {
        if (any[prop] instanceof Object && any.hasOwnProperty(prop)) {
            entities.append(getEntities(any[prop]));
        }
    }
    return entities;
}
console.log(getEntities(h));

この線:

 if (any[prop] instanceof Object && any.hasOwnProperty(prop)) { 

爆撃から数値/null を保持し、any.hasOwnProperty(prop) はオブジェクト プロトタイプにアタッチするのが好きなフレームワークを補います。

于 2012-05-03T21:00:41.103 に答える
0

1 つの方法は、配列を受け取り、そこからメソッドを抽出する再帰メソッドを作成することです。

于 2012-05-03T20:49:49.277 に答える
0

示唆されているように、再帰関数を使用して、可能なすべてのネストされたコンボをループできます。

var allEntities = [];
function getEntities(obj)
{
   if (obj != null)
   {
       var entityName = obj["entity"];
       alert(entityName);
       if (entityName != null)
       {
           allEntities.push(entityName);
           var adjName = entityName.replace(/ /gi, "_");
           var entities = obj[adjName];
           if (entities != null)
           {
               for (var e in entities)
               {
                   var innerEntities = getEntities(entities[e]);
                   for (var inner in innerEntities)
                       allEntities.push(innerEntities[inner]);
               }
           }
       }
    }
}    

for (var k in h.Categories.Facets)
{
    alert(h.Categories.Facets[k].entity);
    getEntities(h.Categories.Facets[k]);
}
alert(allEntities.length);
于 2012-05-03T20:58:56.063 に答える