2016-08-30 8 views
0

ネストされた$ .eachを使用してオブジェクトをループする際に問題が発生しました。オブジェクトは、rootObjectの下にネストされた同じタイプ/クラスのオブジェクトのシリーズです。

オブジェクト

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

ループ

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

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

} 

通報

  1. value1.nameが、ループ内のname以外のオブジェクトプロパティを返しています。一見してvalue.nameをprop1 & prop2に返すと、 "未定義"の値が返されます。

  2. デバッグ時にvalue0の値を調べると、value0はネストされたループに入るときに値が緩やかに見えます。すなわち、親ループからのconsole.log(value1.name)value0で、undefinedとなる。

  3. デバッグ中に子ループ( index1, value1)に見て、私は value1は今 value0.nameに等しいことがわかり、そして index1は、「名前」に等しいです。

答えて

2

あなたは自動的にレベルの深いプロパティを定義することができますが、2のために、あなたが停止し、親インスタンス化する必要があります:大手、それがなければ

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

、これらのプロパティのどれが実際に定義されていない取得されているがあなたのundefined結果に

次の問題は、別の構文の問題である:取得するには

reportObject1 Name 
undefined (x3) 
reportObjectA Name 

:これら二つの修正、あなたのコンソール出力を示し付き

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

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

}); // and HERE 

:あなたは2回の$.each()の呼び出しで閉じ括弧が欠落しています正しい出力、または少なくともいくつかのサンプル出力があれば、この小さな宝石(from here)を使うことができます。構造に潜在的に2つ以上のレベルがある可能性があるため、ここでは再帰が適切と思われます。

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

あなたがenumerate(rootObject)をしようとすると、あなたが得る:

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.明確化を、私は実際にコンストラクタを使用して両親をインスタンス化しています: 'rootObject.reportObject1.reportObjectA =新しいreportObject() ; ' console.logを使用して' rootObject'を出力すると値が表示されます。 2.私のコードに閉じ括弧があります。私はこの例でそれを入力するのを忘れました。 – Oxossi

+0

2。私は自分のコードに閉じ括弧を持っています。私はこの例でそれを入力するのを忘れました。 – Oxossi

+0

3. 'undefined(x3)'はどこから来たのですか?そのビットは私の結果では正確ですが、なぜそれらのプロパティを印刷していますか? – Oxossi

関連する問題