bor*_*ode 1 javascript prototypejs
我有一个以下结构的关联数组(对象)
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.
Run Code Online (Sandbox Code Playgroud)
这是在for..in循环上迭代的,当使用原型时由于使用toJSON()和camelise()等方法扩展类而中断
我尝试过使用Prototype的.each方法但是它错误地报告菜单['子菜单A']是未定义的,它似乎找不到它下面定义的选项.
在原型中迭代关联数组的正确方法是什么?
进一步澄清(感谢目前为止的答案).我正在慢慢地将一个项目迁移到使用原型,但是它有大量的代码尚未与原型兼容.有问题的代码位于其他几个文件使用的库中.代码由函数initialize_menu调用并包含代码
for (var i=0; i < menu.length; i++) {
populate_sub_menu(menu[i])
}
Run Code Online (Sandbox Code Playgroud)
子菜单功能的结构如下
function populate_sub_menu(subMenu){
for (var option in menu[subMenu]) {
html+=menu[subMenu][option]+'html'+subMenu+option;
}
}
Run Code Online (Sandbox Code Playgroud)
我要删除有关获取html元素的代码以及与问题无关的代码.
要创建没有属性的新对象,请使用:
var menu = new Object();
Run Code Online (Sandbox Code Playgroud)
Object构造函数实际上接受一个可选参数.现在让我们来看看你有什么:
var menu = new Object('Submenu A','Submenu B','Submenu C','Submenu D');
Run Code Online (Sandbox Code Playgroud)
只使用第一个参数('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"
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2463 次 |
| 最近记录: |