2016-04-20 4 views
0

Ich versuche, auf Objekte zuzugreifen, die in einem Array verschachtelt sind. Ich fange mit diesem JSON Objekt (das aus einer XML-Datenbankausgabe abgeleitet wurde):Durchschachteln der Verschachtelung von Objekten und Arrays mit Javascript und Unterstrich

{"report": 
     {"date":"15 Apr 2016", 
     "metrics": 
      {"metric": 
       [ 
       {"name":"Bank Angle", 
       "display_parent_group":"Bankfull", 
       "display_child_group":"SiteShape", 
       "tolerance":"0.05", 
       "visits": 
        {"visit": 
        [ 
        {"visit_id":"3047","value": "0.47"}, 
        {"visit_id":"2164","value": "0.55"}, 
        {"visit_id":"1568","value": "0.72"}, 
        {"visit_id":"3431","value": "0.12"}, 
        {"visit_id":"2428","value": "0.44"}, 
        {"visit_id":"1567","value": "0.49"} 
        ]}}, 
       {"name":"Bank Angle SD", 
       "display_parent_group":"Bankfull", 
       "display_child_group":"SiteShape", 
       "tolerance":"0.05", 
       "visits": 
       {"visit": 
        [ 
        {"visit_id":"3047","value": "0.12"}, 
        {"visit_id":"2164","value": "0.05"}, 
        {"visit_id":"1568","value": "0.21"}, 
        {"visit_id":"3431","value": "0.68"}, 
        {"visit_id":"2428","value": "0.22"}, 
        {"visit_id":"1567","value": "0.13"} 
        ]}}, 
       {"name":"Bankfull Area", 
       "display_parent_group":"Bankfull", 
       "display_child_group":"SiteSize","tolerance":"0.05", 
       "visits": 
       {"visit": 
        [ 
        {"visit_id":"3047","value": "202"}, 
        {"visit_id":"2164","value": "193"}, 
        {"visit_id":"1568","value": "115"}, 
        {"visit_id":"3431","value": "258"}, 
        {"visit_id":"2428","value": "89"}, 
        {"visit_id":"1567","value": "206"} 
        ]}} 
       ] 
      } 
      } 
} 

I dann Unterstreichungs verwenden, um eine Teilmenge von metric Objekten zu extrahieren:

var table_metric = JSONData.report.metrics.metric; 

var target_metrics = _.where(table_metric, { 
        display_parent_group : 'Bankfull', display_child_group: 'SiteShape' 
        }); 

dies mit zwei in einer Anordnung resultiert verschachtelte Objekte. Wo ich ein Problem habe, greife ich dann auf das Array von Objekten zu, das innerhalb von visits.visit verschachtelt ist. Wenn zum Beispiel möchte ich ein Array von Werten mit dem Schlüssel visit_id verbunden bauen, und ich versuche:

function buildVisitIDArray(target_metrics) { 
    var attrList = []; 
    for(var i=0; i<target_metrics.length; i++) { 
     var visit_records = target_metrics[i].visits[1]; 
     console.log(visit_records); 
     for(visit_record in visit_records) { 
     attrList.push(_.pluck(visit_record, "visit_id")); 
    } 
} 
return attrList 

}

ich nur eine Reihe von undefinierten Ergebnissen. Ich habe Stunden damit verbracht, Variationen der Syntax auszuprobieren, um an die verschachtelten "Besuchs" -Objekte zu kommen, aber ich kann es einfach nicht herausfinden.

Jede Hilfe wird für diesen Anfänger sehr geschätzt!

Antwort

1

In Ihrer buildVisitIDArray Funktion, versuchen Sie target_metrics zu bekommen [i] .visits [1], als ob es ein Array, aber es ist eigentlich ein Objekt, so dass Sie es auf diese Weise verwendet werden sollen:

function buildVisitIDArray(target_metrics) { 
    attrList = []; 
    for(var i=0; i<target_metrics.length; i++) { 
     var visit_records = target_metrics[i].visits; // Removed the array call ([1]) 
     console.log(visit_records); 
     for(visit_record in visit_records) { 
      attrList.push(_.pluck(visit_records[visit_record], "visit_id")); 
     } 
    } 
    return attrList; 
} 

Hoffe, es hilft :)

+0

Danke André. Jetzt bekomme ich ein Array mit der richtigen Länge (5), aber alle Elemente sind 'undefiniert'. Ich mache immer noch nichts richtig. – jesselangdon

+0

@ tinyplanet00 mein Fehler. Ich habe die Rückgabe der Funktion nicht gesehen. Behoben. In Ihrem for (visit_record in visit_records) ist der visit_record ein Schlüssel, kein Wert. Sie müssen also auf visit_records [visit_record] zugreifen. Jetzt gibt es eine Reihe von IDs zurück :) (der Code wird in meiner Lösung bearbeitet) –

+0

Ah ja, das funktioniert wunderbar. Danke noch einmal! – jesselangdon

0

Sie auch ein Problem haben, wenn Sie nicht attrList mit dem var Stichwort woanders in Ihrem Code definieren.

Aufbauend auf Andre Antwort, sollten Sie diese Zeile ändern zu sein:

visit_records = target_metrics[i].visits.visit;

eine Schicht tiefer zu gehen, dann später eine regelmäßige Anordnung for Schleife tun.

+0

Hoppla. Ja, du hast Recht. Redigiert meine Frage. Vielen Dank! – jesselangdon

Verwandte Themen