[英]Prototype.js and associative arrays
我有以下構造的關聯數組(對象)
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循環上迭代的,該循環在使用原型時中斷,原因是使用toJSON()和camelise()之類的方法擴展了類
我嘗試使用Prototype的.each方法,但是它錯誤地報告菜單['Submenu 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元素的代碼,這些與問題無關。
要創建沒有屬性的新對象,請使用:
var menu = new Object();
Object構造函數實際上采用一個可選參數。 現在,讓我們看看您擁有什么:
var menu = new Object('Submenu A','Submenu B','Submenu C','Submenu D');
僅使用第一個參數( 'Submenu A'
),而其他參數則被忽略。 但是,將字符串文字傳遞給Object構造函數會導致返回新的String
對象,而不是Object
對象。 我正在推測,這可能是Prototype的each()
正在起作用的原因(如果它真的因此而失敗)。
您提到“錯誤報告菜單['SubmenuA']未定義”。 您的問題有錯字嗎? 您正在設置“ Submenu 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"
}
};
您需要原型的Hash 。
使用hasOwnProperty方法,該方法僅對您在對象實例上定義的屬性返回true:
for (var option in menu[subMenu]){
if(menu[subMenu].hasOwnProperty(option)){
html+=menu[subMenu][option]+'html'+subMenu+option;
}
}
您可以簡單地檢查當前對象是否為您要查找的類型(或您要避免的對象,例如函數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.