2009-01-26 53 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; 
    } 
    }