2016-08-30 2 views
0

Ich habe Probleme beim Durchlaufen eines Objekts mit einem verschachtelten $ .Each. Das Objekt ist eine Reihe von Objekten desselben Typs/derselben Klasse, die unter rootObject verschachtelt sind.

Das Objekt

var rootObject ={}; 

rootObject.reportObject1.name = "reportObject1 Name"; 
rootObject.reportObject1.prop1 = "reportObject1 Prop1_Value"; 
rootObject.reportObject1.prop2 = "reportObject1 Prop2_Value"; 

rootObject.reportObject1.reportObjectA.name = "reportObjectA Name"; 
rootObject.reportObject1.reportObjectA.prop1 = "reportObjectA Prop1_Value"; 
rootObject.reportObject1.reportObjectA.prop2 = "reportObjectA Prop2_Value"; 

The Loop

$.each(rootObject, function(index0, value0){ 
    console.log(value0.name); 

    $.each(value0, function(index1, value1){ 
    console.log(value1.name); 
    } 

} 

Das Problem

  1. value1.name gibt andere Objekteigenschaften als name in der Schleife zurück. Es versucht anscheinend, value.name für prop1 & prop2 zurückzugeben, resultierend in "undefined" Werten.

  2. Wenn Sie den Wert value0 während des Debuggings betrachten, scheint value0 seinen Wert zu verlieren, da er in die verschachtelte Schleife eintritt. Bei console.log(value1.name), value0, wird aus der Elternschleife undefined;

  3. Wenn sie in die Kinderschleife (index1, value1) während des Debuggens suchen, ich sehe, dass value1value0.name jetzt gleich, und index1 gleich „name“.

Antwort

2

Sie können automatisch Eigenschaften definieren ein Ebene tief, aber für zwei müssen Sie die Eltern stoppen und instanziiert:

var rootObject ={}; 

rootObject.reportObject1 = {}; // HERE 
rootObject.reportObject1.name = "reportObject1 Name"; 
rootObject.reportObject1.prop1 = "reportObject1 Prop1_Value"; 
rootObject.reportObject1.prop2 = "reportObject1 Prop2_Value"; 

rootObject.reportObject1.reportObjectA = {}; // and HERE 
rootObject.reportObject1.reportObjectA.name = "reportObjectA Name"; 
rootObject.reportObject1.reportObjectA.prop1 = "reportObjectA Prop1_Value"; 
rootObject.reportObject1.reportObjectA.prop2 = "reportObjectA Prop2_Value"; 

Ohne dass keine dieser Eigenschaften sind tatsächlich definiert zu werden, was zu Ihren undefined Ergebnissen.

Die nächste Ausgabe ist eine andere Syntax Problem: Sie schließen Klammern an den beiden $.each() Anrufe sind vermisst:

$.each(rootObject, function(index0, value0){ 
    console.log(value0.name); 

    $.each(value0, function(index1, value1){ 
    console.log(value1.name); 
    }); // HERE 

}); // and HERE 

Mit diesen beiden Korrekturen, die Konsole Ausgabe zeigt:

reportObject1 Name 
undefined (x3) 
reportObjectA Name 

Um die richtige Ausgabe, oder zumindest einige Beispielausgabe, könnten Sie dieses kleine Juwel (from here) verwenden. Da Ihre Struktur möglicherweise mehr als zwei Ebenen haben könnte, scheint hier eine Rekursion angebracht zu sein.

function enumerate(o,s){ 

    //if s isn't defined, set it to an empty string 
    s = typeof s !== 'undefined' ? s : ""; 

    //iterate across o, passing keys as k and values as v 
    $.each(o, function(k,v){ 

     //if v has nested depth 
     if(typeof v == "object"){ 

      //write the key to the console 
      console.log(s+k+": "); 

      //recursively call enumerate on the nested properties 
      enumerate(v,s+" "); 

     } else { 

      //log the key & value 
      console.log(s+k+": "+String(v)); 
     } 
    }); 
} 

Wenn Sie enumerate(rootObject) versuchen, erhalten Sie:

reportObject1: 
    name: reportObject1 Name 
    prop1: reportObject1 Prop1_Value 
    prop2: reportObject1 Prop2_Value 
    reportObjectA: 
    name: reportObjectA Name 
    prop1: reportObjectA Prop1_Value 
    prop2: reportObjectA Prop2_Value 
+0

1. Klärung, ich bin Instanziieren eigentlich die Eltern mit einem Konstruktor: 'rootObject.reportObject1.reportObjectA = new Report() ; ' Ich sehe Werte, wenn ich' rootObject' mit console.log drucke 2. Ich habe die schließende Klammer in meinem Code. Ich habe vergessen, es in diesem Beispiel einzugeben. – Oxossi

+0

2.Ich habe die schließende Klammer in meinem Code. Ich habe vergessen, es in diesem Beispiel einzugeben. – Oxossi

+0

3. Woher kommt das 'undefined (x3)'? Dieses Bit ist in meinen Ergebnissen korrekt, aber warum druckt es diese Eigenschaften? – Oxossi