2009-01-26 54 views
1

我有以下結構的Prototype.js和關聯數組

var menu = new Object('Submenu A','Submenu B','Submenu C','Submenu D'); 
menu['Submenu A']=new Object(); 
menu['Submenu A']['Option A']= 'foo blah text'; 
menu['Submenu A']['Option B']= 'blah more text'; 
menu['Submenu B']['Option A']= 'blah blah'; 
menu['Submenu B']['Option B']= 'texty text'; 
... 
etc. 

這被遍歷for..in循環使用原型時由於延伸與方法的類,打破的關聯數組(對象) likeJSON()和camelise()

我試圖使用Prototype的.each方法,但它報錯菜單['子菜單A']錯誤報告是不確定的,它似乎無法找到定義的選項它。

迭代原型中關聯數組的正確方法是什麼?

進一步澄清(感謝迄今爲止的答案)。 我正在慢慢地將項目遷移到使用原型,但它有大量原型不兼容的代碼。有問題的代碼位於其他幾個文件使用的庫中。 如通過函數,initialize_menu打來電話,包含的代碼

for (var i=0; i < menu.length; i++) { 
    populate_sub_menu(menu[i]) 
} 

子菜單功能的結構是這樣

function populate_sub_menu(subMenu){ 
    for (var option in menu[subMenu]) { 
     html+=menu[subMenu][option]+'html'+subMenu+option; 
    } 
} 

我留下了關於獲得HTML元素並使得AREN代碼代碼與問題無關。

回答

5

要創建沒有屬性的新對象,用途:

var menu = new Object(); 

的對象構造函數實際上有一個可選參數。現在,讓我們來看看你有什麼:

var menu = new Object('Submenu A','Submenu B','Submenu C','Submenu D'); 

只有當其他人都簡單地忽略正在使用的第一個參數('Submenu A')。但是,將字符串文字傳遞給Object構造函數將導致返回一個新的String對象而不是Object對象。我在猜測,這可能是原型的each()行事起來的原因(如果它真的因此而失敗)。

您提到「它錯誤報告菜單['SubmenuA']未定義」。你的問題有錯字嗎?您正在設置「子菜單A」屬性,在「A」之前留有空格,而您報告的錯誤似乎缺少空間。

您似乎也在設置對象屬性時採取了很長的路線。使用對象文本語法會有很多更短,不易出錯:

var menu = { 
    "Submenu A": { 
     "Option A": "foo blah text", 
     "Option B": "blah more text" 
    }, 
    "Submenu B": { 
     "Option A": "blah blah", 
     "Option B": "texty text" 
    } 
}; 
+0

謝謝,我改寫了對象,你建議的方式,現在它的工作中都的Prototype.js和在我的項目非原型頁面。 – borkencode 2009-01-30 21:25:58

0

您可以簡單地檢查當前對象是否是您正在尋找的類型(或者您試圖避免的類型,如函數)。

1

使用hasOwnProperty方法,這將只爲你創建的對象定義的屬性返回true:

for (var option in menu[subMenu]){ 
    if(menu[subMenu].hasOwnProperty(option)){ 
     html+=menu[subMenu][option]+'html'+subMenu+option; 
    } 
    }