Prototype.js和关联数组

时间:2009-01-26 03:56:01

标签: 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.

这是在for..in循环上迭代的,当使用原型时由于使用像toJSON()和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元素以及与问题无关的代码。

4 个答案:

答案 0 :(得分:5)

要创建没有属性的新对象,请使用:

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']未定义”。你的问题有错字吗?您正在设置“子菜单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"
    }
};

答案 1 :(得分:1)

你想要Prototype的Hash

答案 2 :(得分:1)

使用hasOwnProperty方法,该方法仅对您在对象实例上定义的属性返回true:

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

答案 3 :(得分:0)

您可以简单地检查当前对象是否是您正在寻找的类型(或者您要避免的类型,如函数)。