2015-10-01 32 views
1

可以说我有3个JavaScript对象是这样的:如何循环浏览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

阅读['for..in'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in)或['Object.keys '](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)应该有帮助。 – Teemu

回答

0

如果您正在学习,那么对于...而言,您正在寻找。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

但是,个人而言,我鄙视非实用代码中任何类型的循环。作为该计划的读者,我必须停止每个循环,并找出作者为什么要循环。 (要查找某些内容?要过滤到结果的子集?访问每个结果并执行某些操作?提取一些数据?)。更好的方法是使用下划线(http://underscorejs.org)。这些行为都是明确的。 (_.find,_.filter,_.each,_.map,_.pluck等)

_.each(obj_parent, function(key, value){ /* do something */ })

+0

如果OP想要纯JavaScript,可以使用Object.keys(obj_parent).forEach(function(key){/ * do something * /});'。顺便说一句,如果您有完整的html/js示例,代码片段才有意义。否则,它只是占用空间。 – Teepeemm

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

这里是一个JsFiddle Demo

+0

我这样做是为了实现我的目标。唯一的情况是我想要显示story_main或者哪个人会在那个位置。 – kingcobra1986

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语句中,我让它检查计数器并跳过第一个弹出的主属性。