簡體   English   中英

Prototype.js和關聯數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM