2016-04-17 6 views
0

Ich habe ein Objekt, das so aussieht.Abrufen von Daten von einem Objekt

{ 
"class_details":{ 
        "class_1":{student_4":"<name>","student_3":"<name>,student_2":"<name>","student_1":"<name>}, 
        "class_2":{"student_1":"<name>}, 
        "class_0":{student_2":"<name>","student_1":"<name> 
       } 
} 

Ich versuche, eine Schleife zu verwenden, in den Klassen zu wiederholen, aber ich bin zu tun, es nicht in der Lage eine perfekte Art und Weise zu finden.

ich so etwas tun kann nicht,

for(int i=0; i < $scope.rounds.class_details.length;i++) 
    console.log($scope.rounds.class_details.round_[i]) 

So mache ich das

for(int i=0; i < $scope.rounds.class_details.length;i++) 
    console.log(Object.keys($scope.rounds.class_details)[i]) 

Aber hier die Klasse Details kommen nicht in einer Reihenfolge, und diese zählt in meinem Fall.

Es wäre toll, wenn es zu

for(int i=0; i < $scope.rounds.class_details.length;i++) 
     console.log($scope.rounds.class_details.round_[i]) 

oder wenn es eine einfache Möglichkeit, eine Alternative ähnlich ist, die JSON-Klasse Details zu sortieren.

+0

http://stackoverflow.com/questions/5467129/sort-javascript-object-by-key – Chris

+0

Ich werde das sicher versuchen, würde aber gerne, wenn ich Daten wie $ scope.rounds.class_details lesen kann. rund _ {0}} –

Antwort

0

Der einfachste Weg, um Daten zu lesen, wie Sie hoffen, ist die folgende: -

for(int i=0; i < $scope.rounds.class_details.length;i++) 
    console.log($scope.rounds.class_details["round_" + i]); 

Dies ist, weil Sie eine Objekte Eigenschaft auf zwei Arten zugreifen: -

  1. Hier können Sie passieren einen dynamischen Wert (dh der Wert i)

    object["property" + withVariable + "Name"]

  2. Einfacher, lesbarer Weg, wo Sie die Immobilie kennen.

    object.propertyName

+0

Danke !!! Sich dumm fühlen jetzt –

+0

Ich verstehe nicht, warum '$ scope.rounds.class_details' eine Länge hat. Es ist ein Objekt, kein Array. –

+0

Ich weiß, das ist seltsam ... Es würde keine Länge haben, es sei denn, es wird als eine Eigenschaft irgendwo in den Zeilen hinzugefügt ... Vielleicht lohnt es sich zu überprüfen, Sie wiederholen die Anzahl der Klassen-Details korrekt, @MukundGandlur (etwas wie Object.keys ($ scope.rounds.class_details) .length sollte in IE9 arbeiten +) – Shakespeare

0

Zuerst beheben json. Hinweis: einige Anführungszeichen fehlen in dem ursprünglichen Code.

"class_details":{ 
     "class_1":{ 
      "student_4":"<name>", 
      "student_3":"<name>", 
      "student_2":"<name>", 
      "student_1":"<name>" 
     }, 
     "class_2":{ 
      "student_1":"<name>" 
     }, 
     "class_0":{ 
      "student_2":"<name>", 
      "student_1":"<name>" 
     } 
    } 

dazu Gefolgt:

//parse to json. Assume the 
     //'body' is the json data received 

//if there is data in body 
if(body){ 
    //parse body 
    var parsed_body= JSON.parse(body); 

    //your data 
    var class_details = parsed_body.class_details; 
    var class_2_student_1 = parsed_body.class_details.class_2.student_1; 

    //if you want to print json directly to the front-end, 
    //then Object Object may be printed out. to prevent this, 
    //one could use .toString() to convert Object to String. 
} 

else{}//do something if no data in the body 
1

Um die Schlüssel in aufsteigender Reihenfolge zu tun bekommen:

var class_details_keys = Object.keys($scope.rounds.class_details); 
class_details_keys = class_details_keys.sort(function(a,b) {return (+a.substring(6)) - (+b.substring(6));}); 
for(int i=0, length = class_details_keys ; i < length;i++) 
    console.log($scope.rounds.class_details[class_details_keys[i]]); 

Dies wird Ihre Klassen aufsteigend zurückkehren, indem den Teil nach 'class_' nehmen und befehle sie. Sie können keinen einfachen Stringvergleich durchführen, da "4"> "10" ein falsches Ergebnis liefert.

+0

Sortierfunktionen sollten -1, 0 oder +1 zurückgeben, kein Boolean. –

+0

Bearbeitet, um den korrekten Wert zurückzugeben – randominstanceOfLivingThing