假设我有3个像这样的JavaScript对象:
var obj_parent = {
main: $("#parent_main_1"),
tab: $("#parent_tab_1"),
story: {
main:$("#story_main"),
tab: $("#story_tab")
},
recipe: {
main: $("#recipe_main"),
tab: $("#recipe_tab")
},
car: {
main: $("#car_main"),
tab: $("#car_tab")
},
animal: {
main: $("#animal_main"),
tab: $("#animal_tab")
}
};
我想循环浏览此对象以隐藏食谱,汽车和动物对象的所有“主要”。我想使用循环,所以如果我需要添加另一个对象,我不必更改代码。我这样做是为了让对象更舒服。我知道如果它是一个数组我可以这样做:
for ( var i = 3; i < obj_parent.length; i++) {
obj_parent[i][0].hide();
}
这些对象中的每一个都是不同的,关键词也不一样,所以下一个可能是这样的:
var obj_parent2 = {
main: $("#parent_main_1"),
tab: $("#parent_tab_1"),
earth: {
main:$("#earth_main"),
tab: $("#earth_tab")
},
moon: {
main: $("#moon_main"),
tab: $("#moon_tab")
},
computer: {
main: $("#computer_main"),
tab: $("#computer_tab")
},
building: {
main: $("#building_main"),
tab: $("#building_tab")
}
};
我希望它是严格的javascript,而不是jQuery。我正在努力理解这门语言。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:2)
要迭代对象的属性,可以使用for .. in
循环(MDN Docs)。由于您希望解决方案适用于任何对象,因此您应该包括一些鸭子类型和防御性编程 - 您应该检查是否存在所需的属性/函数。
您可以输入以下内容:
for(var key in obj_parent){
var prop = obj_parent[key];
// Check if the prop is truty, if it has a property with name main
// and if this main sub-property has function hide to avoid uncaught errors.
if(prop && prop.main && typeof(prop.main.hide) === 'function') {
prop.main.hide();
}
}
答案 1 :(得分:0)
如果你正在学习,那么...就是你正在寻找的东西。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
但是,就个人而言,我鄙视非实用程序代码中的任何类型的循环。作为程序的读者,我必须停在每个for循环并找出作者循环的原因。 (要查找某些内容?要过滤到结果的子集?要访问每个结果并导致某些操作?要提取一些数据?)。更好的是使用underscorejs(http://underscorejs.org)。每个行动都是明确的。 (_.find,_.filter,_.each,_. map,_.pluck等)
_.each(obj_parent, function(key, value){ /* do something */ })
&#13;
答案 2 :(得分:0)
在@victorbahtev的帮助下,我最终做了this
function testing(obj){
var i = 0;
for(var key in obj){
var prop = obj[key];
if(prop && prop.main &&typeof(prop.main.hide) === 'function') {
if (i !== 0)
prop.main.hide();
else
i++;
}
}
}
我在他的代码中添加的是计数器,然后在循环中的if语句中,我检查了计数器并跳过了第一个弹出主属性的计数器。