tome la entrada JSON y guárdela en una matriz (javascript)

Tengo una entrada JSON de

{
    "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"
            }]
        }]

    }
}

Necesito obtener los valores para la entidad en cada nivel en una matriz.

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

Puedo pasar el primer nivel con el código.

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

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

}

¿Cómo llego a través de los niveles internos para obtener los valores de la entidad?

preguntado el 03 de mayo de 12 a las 21:05

4 Respuestas

Debes hacer un foreach en cada entidad. Si sabe cuántos niveles hay, puede anidar bucles. Si no, probablemente debería optar por una función recursiva.

Editar

Función recursiva:

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

Entonces usa:

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

¡Buena suerte!

contestado el 03 de mayo de 12 a las 21:05

No estoy familiarizado con las funciones recursivas... Los niveles serán diferentes para cada entrada, así que supongo que no hay otra opción que no sea recursiva... - user1371896

La respuesta recursiva más general:

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));

La línea:

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

Evita que los números/nulos se bombardeen y any.hasOwnProperty(prop) compensa los marcos que les gusta adjuntar al prototipo de Objeto.

contestado el 03 de mayo de 12 a las 22:05

Una forma es escribir un método recursivo que acepte una matriz y extraiga los métodos de ella.

contestado el 03 de mayo de 12 a las 21:05

Como se sugiere, puede usar una función recursiva para recorrer todos los combos anidados posibles:

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);

contestado el 04 de mayo de 12 a las 06:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.