我有一个具有以下构造的关联数组(对象)
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)时中断
我曾尝试使用 Prototype 的 .each 方法,但它会错误地报告菜单 ['Submenu A'] 未定义,它似乎无法找到在其下定义的选项。
在原型(prototype)中迭代关联数组的正确方法是什么?
进一步说明(感谢到目前为止的回答)。 我正在慢慢地将一个项目迁移到使用原型(prototype),但它有大量的代码还不兼容原型(prototype)。有问题的代码位于其他几个文件使用的库中。 代码由函数 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()
出错的原因(如果它真的因此而失败的话)。
您提到“报告 menu['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"
}
};
关于javascript - Prototype.js 和关联数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/478815/