簡體   English   中英

通過嵌套$ .each遍歷對象

[英]Loop through object with nested $.each

我在使用嵌套的$ .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以外的對象屬性。 似乎正在嘗試返回prop1prop2 ,從而導致“未定義”值。

  2. 當尋找到的值value0調試期間, value0出現在進入嵌套循環失去它的值。 即從父循環的console.log(value1.name) value0變為undefined

  3. 在調試過程中查看子循環( index1, value1 )時,我看到value1現在等於value0.name ,而index1等於“ name”。

您可以自動定義一個深度的屬性,但是對於兩個屬性,您需要停止並實例化父級:

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結果。

下一個問題是另一個語法問題:您在兩個$.each()調用上缺少$.each()括號:

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

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

}); // and HERE

有了這兩個修復程序,您的控制台輸出將顯示:

reportObject1 Name
undefined (x3)
reportObjectA Name

為了獲得正確的輸出或至少一些示例輸出,您可以使用這個小寶石( 從此處開始 )。 因為您的結構可能具有兩個以上的級別,所以在這里遞歸似乎很合適。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM