如何遍历JavaScript对象但不对特定键执行操作?

时间:2015-10-01 18:24:29

标签: javascript object for-loop javascript-objects

假设我有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。我正在努力理解这门语言。任何帮助,将不胜感激。谢谢!

3 个答案:

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

这是JsFiddle Demo

答案 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等)

&#13;
&#13;
_.each(obj_parent, function(key, value){  /* do something */ })
&#13;
&#13;
&#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语句中,我检查了计数器并跳过了第一个弹出主属性的计数器。