[英]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);
}
}
問題
value1.name
返回的是循環中name以外的對象屬性。 似乎正在嘗試返回prop1
和prop2
,從而導致“未定義”值。
當尋找到的值value0
調試期間, value0
出現在進入嵌套循環失去它的值。 即從父循環的console.log(value1.name)
value0
變為undefined
;
在調試過程中查看子循環( 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.