2015-10-01 30 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語句中,我讓它檢查計數器並跳過第一個彈出的主屬性。