2012-08-31 24 views
0

我有一個對象this.themeData是這樣的(顯示控制檯輸出)我應該如何循環和JavaScript中的「關聯對象」?

Object 
    Banner: Object 
     property: "null" 
     raw: "uploads/1/somefile.png" 
     selector: "null" 
     value: "../../uploads/1/somefile.png" 
     __proto__: Object 
    H1_FontSize: Object 
    H2_FontColor: Object 
    H2_FontSize: Object 

和我遍歷這樣的:

for (attrName in this.themeData) { 
     attrData = this.themeData[attrName]; 
     if (attrData.selector && attrData.value) { 
      $(".SomeSelector").css(attrData.property, attrData.value); 
     } 
    } 

這工作,但我在最近的SO question看到了,我不該」 t使用for in。但是,如果索引不是數字值,我該如何循環訪問for(var i = 0; i<arr.length; i++)其中this.themeData[i]不存在?

+0

看來你沒有看到其他問題的全部答案......它完全描述瞭如何遍歷對象以及陷阱是什麼。在這裏的答案中提到的所有東西(使用'hasOwnProperty')在這裏也會有更詳細的解釋。 –

回答

2

它的優良的for..in對象上循環使用,你只需要使用hasOwnProperty()來過濾他們檢查

for (attrName in this.themeData) { 
    if (this.themeData.hasOwnProperty(attrName)) { 
     attrData = this.themeData[attrName]; 
     if (attrData.selector && attrData.value) { 
      $(".SomeSelector").css(attrData.property, attrData.value); 
     } 
    } 
} 
2

使用for...in方法在我看來很好,只是一定要檢查你正在尋找的屬性不是來自原型鏈的某個地方。

var foo = Object(); 
for(item in foo) { 
    if(foo.hasOwnProperty(item) { 
     alert(item); // The key 
     alert(foo[item]); // The value. 
    } 
} 

如果你不檢查hasOwnProperty,你會從Object繼承的屬性而告終。