[英]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.